2012-02-26 6 views
43

私は、これは、検索語が見つかった行番号と行の束になった例えばコマンドの出力をどのように配列に割り当てるのですか?

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

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

1 
3 
12 
19 

bashアレイに割り当てる最も簡単な方法は何ですか?変数に変数を代入すれば、スペースで区切られた文字列になります。

+0

参照[この質問](http://stackoverflow.com/questions/971162/how-to-initialize-a-bash-array-with-output-pipe-from-another-command) – beerbajay

+0

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

+0

ooh ...より完全に検索してください。ありがとう。 –

答えて

93

を使用するには、配列代入の内部でコマンド置換を使用する必要があります。

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

内側の$()はコマンドを実行し、outer()は出力を配列にします。この問題は、スペースを含むファイルでは機能しないことになります。これを処理するには、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[@]%%:*}") 
+3

と、要素内の空白で大文字小文字を処理するためのものです。まさに私が探していたもの。 –

+1

IFSのものは素晴らしいです!時間を探していた! – Drutten

+1

これは素晴らしい、まさに私が必要なものです! –

4

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

+2

しかし、スペースを含むファイルでは壊れています。 – jordanm

+0

@jordanm use 'find。 -printf "\"%p \ "\ n" ' –

+0

ありがとう! Btw、私はあなたがセミコロンを 'for x output $ echo do x $に置いたと思います。完了; ' –

関連する問題