2009-07-22 33 views
29

一部の行に文字列 "ERROR"のログファイルがあります。私はが0以外のすべての行を削除したいと思います。にはエラーがありますので、修正が必要なものがわかります。空の文字列と非エラー行を置き換えるために正規表現が負の正規表現(つまり、正規表現と一致しない文字列を見つける)

% S /(ERROR)//

:!私はvimの中で、次のような何かをするつもりでした。

答えて

50

が一致しないすべての行を削除するには:g!コマンドを使用して...私は、標準的な正規表現は、これを行うことができると信じていませんが、多分私は間違っています。

:g!/ERROR/d 
+23

':v/ERROR/d'は等価です – rampion

0

否定一致正規表現では、^ が使用されます。 [^ E]はE.

+3

これは当てはまりますが、このような正規表現は、Eを含まないすべての*文字*と一致します。ネガティブマッチは1文字を超えて拡張するのは難しいです。 –

1

以外のすべてと一致します* nixの上であれ​​ば、あなたはgrepの-vまたはWindowsマシン上のawk

awk '!/ERROR/' file | more 

を使用することができ、あなたは

findstr /v /c:ERROR file | more 
8

をfindstrは使用することができますvimでは、バッファ内のテキストに対して任意のフィルタコマンドを実行できます。たとえば、

:%!grep ERROR 

は、指定された正規表現に一致する行だけをバッファ全体に置き換えます。

これは、grep以上の場合に便利です。たとえば、バッファ内の行を:%!sortでソートすることができます。あるいは、ブロックをマークするためにVコマンドを使用してテキストの範囲を変更することができます。:!filter-command(vimは自動的に'<,'>を入力して、現在マークされているブロックを示します)。

+0

vim /別のファイルにリダイレクトする必要のないコマンドの場合は –

+0

':grep'と':sort'はVimに組み込みの意味を持っているので、 ':!grep'と':!sort'、ちょうど混乱します)。 – ephemient

1

negative lookaheadを使用しました。

+7

例: '%s/^ \(\ ERROR \)\ @!$ \ n // g'なしの非常に有用な答えはありません。 Vimでは '\ @!'は負のルックアヘッドインジケータであり、そのリンクからの '(?!)'フォーマットではありません。しかし、 ':g!'答えは簡単です。 – atomicules

+0

私は@atomiculesに同意しますが、私はそれにもかかわらずアレクサンダーの答えをアップアップしています。なぜなら、「否定的な先読み」は、今後のウェブ検索にとって有益な用語だからです。 –

関連する問題