1. ホーム
  2. arrays

[解決済み] コマンドの出力を配列に代入する方法を教えてください。

2023-01-24 19:37:24

質問

の結果を grep からの結果を配列に代入したいのですが、例えば

grep -n "search term" file.txt | sed 's/:.*//'

この結果、検索語が見つかった行番号を持つ行が大量に表示されました。

1
3
12
19

bashの配列に代入する一番簡単な方法は何でしょうか?単純に変数に代入すると、スペースで区切られた文字列になってしまいます。

どのように解決するのですか?

コマンドの出力を配列に代入するには、配列代入の内部でコマンド代入を使用する必要があります。一般的なコマンドの場合 command のようになります.

arr=( $(command) )

OPの例では、こうなります。

arr=($(grep -n "search term" file.txt | sed 's/:.*//'))

内側の $() はコマンドを実行し、外側の () は出力が配列になるようにします。この場合の問題は、コマンドの出力にスペースが含まれている場合に動作しないことです。これを処理するために IFS\n .

IFS=$'\n' arr=($(grep -n "search term" file.txt | sed 's/:.*//'))

また、配列の各要素に対して展開を行うことで、sedの必要性をなくすことができます。

arr=($(grep -n "search term" file.txt))
arr=("${arr[@]%%:*}")