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)
説明する:
- 内部ループは、使用ファイルのパターンリスト内
while
の1つ以上のパターンに一致するすべての行を印刷します。text.txt
args.txt
- その後、リストがソートされ()、
sort
発生回数が計算されます(uniq -c
)。 - 外部
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
関連:
答え2
使用awk
。
~$ cat textlist.txt | awk '/life/ && /happy/ && /horse/ { print; }'
The horse has a happy life
textlist.txtはあなたが与えた文のリストです。
答え3
agrep
以下を使用して申請できます。そして仕事。残念ながら適用できません。そしてファイルのパターンリストなので、まずコマンドパラメータに展開する必要があります。
patterns=$(sed 's/;/\\;/' <args | tr '\n' ';' | sed 's/;$//')
agrep "$patterns" text
生成されたパターンのリストに対する修正はセミコロンにまとめられます。ただし、リストの末尾にセミコロンを含めることができないため、削除されます。すでにセミコロンを含むパターンは、その文字をエスケープして、次のように処理しないようにする必要があります。そしてオペレーター。ファイルがどのように変換されたかをecho "$patterns"
確認するために使用されます。args
答え4
おそらくこれは最も効率的なアプローチではありませんが、うまくいくようです。
# for a in $(cat args); do regex="$regex | grep '$a'"; done
# eval cat text "$regex"
The horse has a happy life.