2012-02-26 98 views
43

我需要從一個grep結果分配給數組...例如如何將命令的輸出分配給數組?

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

這導致一串與行號線在其中找到搜索術語的。

1 
3 
12 
19 

將它們分配給bash數組最簡單的方法是什麼?如果我簡單地將它們分配給一個變量,它們將變成空格分隔的字符串。

+0

見[這個問題](http://stackoverflow.com/questions/971162/how-to-initialize -bash-array-with-output-piped-from-another-command) – beerbajay 2012-02-26 00:40:13

+0

空格分隔的字符串在bash中很容易遍歷。 – 2012-02-26 00:42:08

+0

哦...應該更徹底地搜索。謝謝。 – 2012-02-26 00:46:02

回答

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

加上一個用於處理元素中空白的情況。正是我在找什麼。 – 2015-04-02 17:22:15

+1

IFS的東西太棒了!一直在尋找小時! – Drutten 2016-08-12 12:09:05

+1

這真棒,正是我所需要的! – 2017-07-26 21:42:06

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 2012-02-26 01:01:45

+0

@jordanm使用'find。 -printf「\」%p \「\ n」' – 2012-02-26 01:17:45

+0

謝謝!順便說一句,我認爲你錯過了在$輸出做$ echo $ x的分號?完成;' – 2012-02-26 05:40:17

相關問題