からの結果を配列に割り当てる必要がありgrep
ます...たとえば
grep -n "search term" file.txt | sed 's/:.*//'
これにより、検索語が見つかった行番号の行が多数表示されました。
1
3
12
19
それらをbash配列に割り当てる最も簡単な方法は何ですか?それらを変数に割り当てるだけで、スペースで区切られた文字列になります。
からの結果を配列に割り当てる必要があり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[@]%%:*}")
スペースで区切られた文字列は、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 $output | awk '{for(i=1;i<=NF;i++) print $i;}'
# convert to an array
ar=($output)
echo ${ar[3]} # echos 4th element
ファイル名の使用スペースを考えている場合find . -printf "\"%p\"\n"