単語配列でgrepコマンドを使用する

単語配列でgrepコマンドを使用する

いくつかの行を含むテキストファイルがあり、次を使用してテキストファイルを配列に保存しています。

readarray -t array < Textfile

テキストファイルには次の内容が含まれています。

123
456
789

grepコマンドを使用して配列を使用する別のテキストファイルで結果を検索しようとしているので、「123」、「456」、または「789」が表示される行を印刷します。配列をテストするために、grepの同じテキストファイルで「123」、「456」、および「789」を見つけて、3文字のシリーズのうちの1つ以上が発生した場合に一致する行を出力してみました。

頑張った

grep "${array[*]}" Textfile

しかし、これは何の結果も示していません。私は何が間違っていましたか?

ベストアンサー1

まず、ファイル自体を使用できます。これはシェル配列を使用するよりもはるかに簡単です。

grep -f file1.txt file2.txt

file2.txtこれにより、すべての行に一致するすべての行が印刷されますfile1.txt

もしあなたなら持つ何らかの理由で配列を使用すると、状況がより複雑になります。配列内のスペースで区切られた要素のリストに展開されるため、grep "${array[*]}" Textfileこれを行うことはできません。"${array[*]}"

$ array=("foo" "bar" "baz")
$ echo "${array[*]}"
foo bar baz

これは、あなたのgrepコマンドが次のようになることを意味します。

grep 'foo bar baz' file

foo bar bazこれは「ファイルから検索file」を意味します。あなたがしたいのはgrepですfooまたは barまたは bazgrep-Eオプションを使用して検索したいパターンを追加するだけです|

grep -E 'foo|bar|baz' file

これを行うには、次のような複雑なタスクを実行する必要があります。

grep -E "$(printf '%s|' "${array[@]}" | sed 's/|$//')" file

おそらく:

grep -E "$(export IFS="|"; echo "${array[*]}")" file

全体的にファイルを使用し、配列を忘れた方が良い、高速、簡単です。

おすすめ記事