ディレクトリとそのサブディレクトリ内のすべてのファイルで特定の文字列を含む行を検索したいのですが、その直後の行に別の特定の文字列を含む結果を除外したいのです。
例:
foo1 searchString bar
foo1 excludeString bar
foo2 searchString bar
something else
foo3 searchString bar
foo3 excludeString bar
foo4 searchString bar
これを返す必要があります:
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar
-A 複数行を出力し、その-v 結果を除外します。しかし、私の現在のgrep -r -A 1 "searchString" | grep -v "excludeString" 明らかに機能しません。
2番目のgrepに、一致するものが見つかった場合は前の行も削除する必要があることを伝える方法はありますか?または、他の方法でこれを達成できますか?
パフォーマンスは私の主な関心事ではありません。ただし、コマンドが比較的覚えやすいと便利です。
承認された回答:
pを使用できます erl c 互換性のあるr 通常のe xpressions grep :
$ pcregrep -M '(searchString.*\n)(?!.*excludeString)' file
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar
searchStringを検索します その後に任意の文字.が続きます 、0回以上繰り返される* 、その後に改行\n のみ ない場合 (?! )パターン.*excludeString その次。オプション-M 複数行に一致させるために存在します。