TL&DR

TL&DR

AND演算を行う場所を調べてみましたが、grep -eこれが私が望むものです。ただし、私が正しく実行した場合、両方の用語が返されるように同じ行にする必要があります。

私が興味を持っているのは、ディレクトリ内の両方の用語を含むすべての文書を見つけることです。おそらく別の行にあるかもしれません。順序が重要な場合は、ある用語が常に他の用語よりも先に来るということを知っていますが、もちろん一般的な解決策も問題ありません。

ベストアンサー1

TL&DR

ノート:どちらが最速かを自分でテストする必要があります。

grep -rlzE '(TermOne.*TermTwo)|(TermTwo.*TermOne)'

find . -type f -exec grep -q 'TermOne' {} \; \
               -exec grep -q 'TermTwo' {} \; \
               -print

awk '/TermOne/{if(p==0)p=1; if(p==2)p=3}
     /TermTwo/{if(p==0)p=2; if(p==1)p=3}
     p==3{print FILENAME;p=0;nextfile}' ./*

ファイル

ファイル内の2つの別々の文字列を一致させることができる正規表現を作成することはできません。

どちらの用語も、次のいずれかを使用して検索できます。

grep -E '(TermOne.*TermTwo)|(TermTwo.*TermOne)' file

またはプレビュー:

grep -P '(?=.*TermOne)(?=.*TermTwo)' file

しかし、前提はこれら2つの項目です同じ行に

GNU grep-zオプションを使用して、ファイル全体を1つのファイルのように機能させることもできます(ファイルにNULが含まれていない場合は、Unixテキストファイルは含まれません)。

grep -zE '(TermOne.*TermTwo)|(TermTwo.*TermOne)' file

with を同時に使用できないため、-z現時点では実行可能なプレビューソリューションはありません。-P

もう一つのオプションは2回grepすることです。

<file grep 'TermOne' | grep -q 'TermTwo'

0ファイル内の両方の用語が見つかった場合にのみ、パイプライン全体の終了コードが通知されます。

またはawkを使用してください。

awk '/TermOne/{if(p==0)p=1; if(p==2)p=3}
     /TermTwo/{if(p==0)p=2; if(p==1)p=3}
     p==3{print "both terms found"; exit}' file

ファイルのリスト

上記の最初の2つのソリューションは、オプション-r(再帰的、ファイル名は不要)、および-l(一致するファイル名のリスト)を追加して、すべてのファイルを再帰的に一覧表示します。

grep -rlzE '(TermOne.*TermTwo)|(TermTwo.*TermOne)'

またはfind(2つのgrep呼び出し)を使用してください。

find . -type f -exec grep -q 'TermOne' {} \; -exec grep -q 'TermTwo' {} \; -print

またはawkを使用してください(globにはPWDのみが含まれています)。

awk '/TermOne/{if(p==0)p=1; if(p==2)p=3}
     /TermTwo/{if(p==0)p=2; if(p==1)p=3}
     p==3{print FILENAME;p=0;nextfile}' ./*

おすすめ記事