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/:.*//'))
unset IFS
_
配列の各要素に対して展開を実行することで、sedの必要性を排除することもできます。
_arr=($(grep -n "search term" file.txt))
arr=("${arr[@]%%:*}")
_
スペースで区切られた文字列は、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"