web-dev-qa-db-ja.com

コマンドの出力を配列に割り当てるにはどうすればよいですか?

grepからの結果を配列に割り当てる必要があります...たとえば

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

これにより、検索語が見つかった行番号を持つ行が多数作成されました。

1
3
12
19

それらをbash配列に割り当てる最も簡単な方法は何ですか?単純に変数に割り当てると、スペースで区切られた文字列になります。

61
ceiling cat

コマンドの出力を配列に割り当てるには、配列の割り当て内でコマンド置換を使用する必要があります。一般的なコマンド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/:.*//'))
unset IFS
_

配列の各要素に対して展開を実行することで、sedの必要性を排除することもできます。

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

スペースで区切られた文字列は、bashで簡単に移動できます。

# save the ouput
output=$(grep -n "search term" file.txt | sed 's/:.*//')

# iterating by for.
for x in $output; do echo $x; done;

# awk
echo $out | awk '{for(i=1;i<=NF;i++) print $i;}'

# convert to an array
ar=($out)
echo ${ar[3]} # echos 4th element

ファイル名にスペースが必要な場合は、find . -printf "\"%p\"\n"

6
Shiplu Mokaddim