ファイルのすべてのパターンを一度に一致[複製]

ファイルのすべてのパターンを一度に一致[複製]

2 つのファイルがあります:argsおよびtext

args: [スクリプトのパラメータを含みます]

life
happy
horse

テキスト:

The horse has a happy life.
Life is fun.
Kids are happy.

text.NETのすべてのパターンを含む行を印刷するには、コマンドが必要ですargs。この場合:The horse has a happy life.

ベストアンサー1

git grep

使用される構文は次のとおりです。git grep複数のパターンを結合するには、ブール式を使用してください。

git grep -e "life" --and -e "happy" --and -e "horse"

上記のコマンドは、すべてのパターンに一致する行を一度に印刷します。

ファイルがバージョン管理対象でない場合は、パラメーター--no-indexを追加します。

Gitで管理されていないファイルを現在のディレクトリから取得します。

助けを確認してくださいman git-grep

grep

通常、引数をgrep使用すると、-f少なくとも1つのパターンを持つ行が印刷されます。

grep -f args.txt file.txt

あなたの場合は動作しません。

したがって、すべてのパターンに一致する行を同時に印刷するには、次のことを試すことができます。

while read n text; do [ $n -eq $(wc -l < args.txt) ] && echo $text; done < <(while read patt; do grep "$patt" text.txt; done < args.txt | sort | uniq -c)

説明する:

  1. 内部ループは、使用ファイルのパターンリスト内whileの1つ以上のパターンに一致するすべての行を印刷します。text.txtargs.txt
  2. その後、リストがソートされ()、sort発生回数が計算されます(uniq -c)。
  3. 外部whileループは、パターン数と同じ発生回数args.txt(例:3)を持つ行のみを印刷します。

別のアプローチは、1つ以上のパターンと一致しないすべての行を削除することです。

Ex/Vimエディタを使用してファイルを所定の位置に変更するソリューションは次のとおりです。

while read patt; do ex +"v/$patt/d" -scwq text.txt; done < args.txt

注:これにより、ファイル自体から不要な行が削除されます。

以下は、画面に結果を印刷するより短いバージョンです。

ex $(xargs -I% printf "+v/%/d " < args.txt) +%p -scq! text.txt

その場所にファイルとして保存する+%p -scq!ように変更します。-scwq


これはシェルエイリアスを定義して解決する方法です。

alias grep-all="</dev/stdin $(xargs printf '|grep "%s"' < args.txt)"

使用例:

grep-all file.txt

関連:

おすすめ記事