2012-02-26 26 views
43

Ben Bu arama terimi bulundu edildiği hat numaraları ile çizgilerin bir demet sonuçlandı örnekBir komutun çıktısını bir diziye nasıl atayabilirim?

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

için ... bir diziye bir grep sonuçları atamanız gerekir.

1 
3 
12 
19 

Onları bir bash dizisine atamanın en kolay yolu nedir? Onları bir değişkene atadığımda, boşlukla ayrılmış bir dizeye dönüşürler.

+0

bakınız [Bu soru] (http://stackoverflow.com/questions/971162: dizinin her öğesi bir genişleme yaparak sed için

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

Ayrıca ihtiyacını kesebilirsiniz/nasıl--başlatma-a-bash-dizi-ile-çıkış-borulu-den-bir-komut) – beerbajay

+0

boşlukla ayrılmış şeritler bash kolayca sürülebilir bulunmaktadır. –

+0

ooh ... daha ayrıntılı arama yapmış olmalıydı. Teşekkürler. –

cevap

93

boşluk düşünme eğer, bir dizi atama içinde bir komut ikamesi kullanmak gerekir.

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

İç $() komutu, dış() çıkışın bir dizi olmasına neden olurken komutu çalıştırır. Bununla ilgili problem, boşluk içeren dosyalarla çalışmadığıdır. Bunu işlemek için IFS'yi \ n olarak ayarlayabilirsiniz.

arr=($(grep -n "search term" file.txt)) 
arr=("${arr[@]%%:*}") 
+3

artı elemanları beyaz alanlara sahip durum tedavisi için. Tam olarak aradığım şey. –

+1

IFS şeyler harika! Saatlerce baktım! – Drutten

+1

Bu, tam olarak ihtiyacım olan şey harika! –

4

Uzay ayrılmış dizeleri bash kolaylıkla geçilebilir bulunmaktadır.

# 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 

Eğer bir diziye çıkış atamak için dosya adı kullanımda find . -printf "\"%p\"\n"

+2

Ancak boşluklu dosyalar için bozuk. – jordanm

+0

@jordanm 'bulmak. -printf "\"% p \ "\ n" ' –

+0

Teşekkürler! Btw, sanırım $ x çıkışında x için bir yarım kolon kaçırdınız x $ do; –

İlgili konular