grep 結果を配列に保存

grep 結果を配列に保存

bash配列のパターンに一致するすべてのファイル名を保存したいと思います。

私の解決策は動作しません。パイプの使用で問題が発生したようですが、どのように解決するのかわかりません。

i=0
find . -type f | grep -oP "some pattern" | while read -r line; do
    arr[$i]=$line;
    let i=i+1;
done

答え1

bash-4.4上記のように使用すると、次のようになります。

readarray -d '' -t arr < <(
  find . -type f -print0 | grep -zP 'some pattern')

以前のbashバージョンの場合:

arr=()
while IFS= read -rd '' file; do
  arr+=("$file")
done < <(find . -type f -print0 | grep -zP 'some pattern')

または(bashzsharr+=()スタイルの構文を持たない古いバージョンとの互換性のため):

arr=() i=0
while IFS= read -rd '' file; do
  arr[i++]=$line
done < <(find . -type f | grep -zP 'some pattern')

あなたのアプローチにはいくつかの問題があります。

  • -oを使用すると、レコード全体ではなくパターンgrepに一致するレコード部分のみが印刷されます。あなたはここでそれをしたくありません。
  • find改行はファイルパスのすべての文字と同じくらい有効であるため、改行で区切られたデフォルトの出力は後処理できません。 NULで区切られた出力が必要です。したがって、NULで区切られたレコードを処理するには-print0infind-zinが必要です。grep
  • IFS=に渡すのも忘れてしまいましたread
  • このオプションがないとbash、パイプラインの最後の部分がサブシェルで実行されるため、そのサブシェルのみをlastpipe更新できます。$arr

関連情報