次の行に文字列が含まれていない grep 文字列

次の行に文字列が含まれていない grep 文字列

特定の文字列を含む行のディレクトリとそのサブディレクトリ内のすべてのファイルを検索したいのですが、次の行に他の特定の文字列を含む結果を除外したいと思います。

たとえば、次のようになります。

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に指示する方法はありますか?それとも別の方法でこれを達成できますか?

パフォーマンスは私の最大の関心事ではありません。コマンドが比較的覚えやすい場合は良いでしょう。

ベストアンサー1

perl準拠のc正規r表現eを使用できますgrep

$ pcregrep -M '(searchString.*\n)(?!.*excludeString)' file
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar

ゼロ個以上の文字searchStringの後に新しい行が続く文字を検索します。.*\n ただもしあればいいえ()パターンの横にあります?!。複数行を一致させる.*excludeStringオプションがあります。-M

おすすめ記事