97

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

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

これにより、検索語が見つかった行番号の行が多数表示されました。

1
3
12
19

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

4

2 に答える 2

159

コマンドの出力を配列に割り当てるには、配列割り当て内でコマンド置換を使用する必要があります。一般的なコマンドの場合、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[@]%%:*}")
于 2012-02-26T01:07:26.340 に答える
11

スペースで区切られた文字列は、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"

于 2012-02-26T00:45:35.743 に答える