2011-04-03 78 views
2

我想知道是否有一種簡單的方法將字符串拆分爲數組和INCLUDE分隔符?Bash shell腳本 - 拆分字符串包括分隔符?

例如:

foo = "a;b;c;d;" 

將會解析到:

"a;" "b;" "c;" "d;" 

似乎大多數功能去除出定界符。

編輯:我需要最終不用回顯輸出,而是一個數組,然後我可以稍後在腳本中操作。另外,如果可以從文本文件中讀取字符串,它可能是最簡單的。

+1

'foo =「something」'已經無效。與大多數其他語言相比,在賦值運算符周圍不支持空格。兩者都必須刪除。 – 2011-04-03 16:01:48

+1

將分隔符附加到項目的末尾會不會是一個問題? (如果你知道如何分割不包括分隔符) – 2011-04-03 16:09:34

+0

是的,對不起,foo =「something」將是正確的語法。謝謝!如果數據中有空白,則 – Dave 2011-04-03 22:17:08

回答

1
declare -a Array=($(echo 'a;b;c;' |cut -d';' --output-delimiter="; " -f1-)) 
echo ${Array[2]} 
> c; 
declare -a Array=($(echo 'a;b;c' |cut -d';' --output-delimiter="; " -f1-)) 
echo ${Array[2]} 
> c 

這是相當粗糙,但嘿,它有點作品。如果輸入中有空格,則需要使用不同的分隔符,因此這不太理想。

+0

將會中斷。這正是爲什麼我說這是嚴重的,需要一個不同的分隔符來支持空格... – 2011-04-03 20:37:02

+0

中有任何空格, – Mat 2011-04-03 20:38:33

+0

數據中沒有空格,所以這應該可以正常工作。 – Dave 2011-04-03 22:17:34

2
foo="a;b;c;d;" 
for z in $(echo $foo | sed -r 's/([^;]+;)/\1 /g') 
do 
    echo $z 
done 

a; 
b; 
c; 
d; 

(後編輯) 如何使一個數組:

# declare -a arr 
arr=($(echo $foo | sed -r 's/([^;]+;)/\1 /g')) 

注:由於格倫指出,它會失敗,如果毛坯建設內容的​​一部分。

我的手冊說,我應該使用declare -a來聲明一個數組,但在實踐中看來,我並不需要它。

+1

將會中斷。 – 2011-04-03 20:29:51

+0

這是否創建一個數組? – Dave 2011-04-03 22:16:16

+0

@Glenn:你說得對。 @Dave:添加了數組語法。如果數據 – 2011-04-03 23:19:40

1
​​3210
+0

我聽說過修改IFS值有點不方便? – Dave 2011-04-03 22:21:28

+0

@Dave:'IFS'非常適合在一個給定的分隔符上分割一個字符串,只要確保在你正在做的事情結束時恢復它的原始值 – Mikel 2011-04-03 22:48:07

+0

@如果你不注意恢復它,在一個子shell中(像'{here}'),你將會安全 – sehe 2011-04-03 23:24:45

0

紅寶石(1.9+)

$ array=($(echo "a;b;c;d;" | ruby -e 'gets.chomp.scan(/(\w;)/).each{|x|print "%s " % x}')) 
$ echo ${array[0]} 
a; 
$ echo ${array[1]} 
b; 
$ echo ${array[2]} 
c; 
$ echo ${array[3]} 
d; 
0

,使得功能外IFS值保持不變,你可以改變一個函數裏面的IFS值。

而且你可以在沒有循環的情況下向每個數組元素附加一個字符串。

(
printf '%q\n' "$IFS" 
splitButKeepDelim() { 
    declare IFS="$1" # limit scope of IFS 
    array=(${2})  # hardcoded array name 
    IFS="" 
    array=("${array[@]/%/;}") # append a ';' to every array item 
    return 0 
} 
unset array 
splitButKeepDelim ';' 'a;b;c;d;' 
printf '%s\n' "${array[@]}" 
printf '%q\n' "$IFS" 
) 
相關問題