2009-07-22 12 views
29

Bazı satırlarda "ERROR" dizesiyle bir günlük dosyasına sahibim. 'un'un HATA içermediği her satırı silmek istiyorum, böylece neyin düzeltilmesi gerektiğini görebiliyorum. Ben vim aşağıdaki gibi bir şey yapacağım:Olumsuz eşleme ile regex (yani, _doesn't_ regex ile eşleşen dizeyi bul)

% s/(HATA) //

boş bir dize olmayan hata çizgileri yerine.

Ben standart regexes bunu yapabilirsiniz inanmıyorum, ama belki de yanılıyorum ...

cevap

50

eşleşmeyen her satırını silmek için :g! komutunu kullanın.

:g!/ERROR/d 
+23

: v/ERROR/d', – rampion

0

Negatif eşleme regex eg için^ kullanacaktır. [^ E] E.

+3

eşdeğeridir. Bu doğrudur, ancak böyle bir regex, her * karakteriyle eşleşir. E, E içermez; bu, E içermeyen tüm * çizgileri * birbirinden farklıdır. Ayrıca, Negatif eşleme, bir karakterin ötesine geçmek için garip. –

1

dışında her şeyi maç olacak * nix üzerinde varsa, grep -v veya Windows üzerinden awk

awk '!/ERROR/' file | more 

kullanabilirsiniz, sen

findstr /v /c:ERROR file | more 
8

Findstr kullanabilirsiniz Vim'de, arabellekteki metne herhangi bir filtre komutu çalıştırabilirsiniz. Örneğin, arabelleğin tamamını yalnızca verilen düzenli ifadeyle eşleşen satırlarla değiştirecektir.

Bu, yalnızca grep'dan daha fazlası için kullanışlıdır, örneğin arabelleği satırları :%!sort ile sıralayabilirsiniz. Ya da, bloğu işaretlemek için V komutunu kullanarak herhangi bir metin aralığı için de yapabilirsiniz ve daha sonra :!filter-command (geçerli işaretli bloğu belirtmeniz için vim otomatik olarak '<,'>'u dolduracaktır). Bir negative lookahead Kullanarak

+0

+1, farklı bir dosyaya vim/yönlendirme bırakılmasını gerektirmeyen bir komut için –

+0

Belki de örneklerin en iyisi değil: 'grep' ve ': sort' Vim'de yerleşik anlamlara sahiptir (bunlar farklıdır). ':! grep' ve':! sort', sadece kafa karıştırıcı olmak için. – ephemient

1

.

+7

Örnek olmadan çok kullanışlı bir cevap değil: ':% s/^ \ (\ ERROR \) \ @! $ \ N // g'. Vim'de '\ @!', Bu bağlantıdan gelen "(?!)" Biçimini değil, negatif bir göz atma göstergesidir. ': G!' Cevabı daha kolay olsa da. – atomicules

+0

@atomicules ile aynı fikirdeyim, ancak yine de Alexander'ın cevabını yükseltiyorum çünkü 'negatif lookahead' daha fazla web araştırması için yararlı bir terim. –