我想知道是否有一種簡單的方法將字符串拆分爲數組和INCLUDE分隔符?Bash shell腳本 - 拆分字符串包括分隔符?
例如:
foo = "a;b;c;d;"
將會解析到:
"a;" "b;" "c;" "d;"
似乎大多數功能去除出定界符。
編輯:我需要最終不用回顯輸出,而是一個數組,然後我可以稍後在腳本中操作。另外,如果可以從文本文件中讀取字符串,它可能是最簡單的。
我想知道是否有一種簡單的方法將字符串拆分爲數組和INCLUDE分隔符?Bash shell腳本 - 拆分字符串包括分隔符?
例如:
foo = "a;b;c;d;"
將會解析到:
"a;" "b;" "c;" "d;"
似乎大多數功能去除出定界符。
編輯:我需要最終不用回顯輸出,而是一個數組,然後我可以稍後在腳本中操作。另外,如果可以從文本文件中讀取字符串,它可能是最簡單的。
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
這是相當粗糙,但嘿,它有點作品。如果輸入中有空格,則需要使用不同的分隔符,因此這不太理想。
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
來聲明一個數組,但在實踐中看來,我並不需要它。
將會中斷。 – 2011-04-03 20:29:51
這是否創建一個數組? – Dave 2011-04-03 22:16:16
@Glenn:你說得對。 @Dave:添加了數組語法。如果數據 – 2011-04-03 23:19:40
紅寶石(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;
,使得功能外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"
)
'foo =「something」'已經無效。與大多數其他語言相比,在賦值運算符周圍不支持空格。兩者都必須刪除。 – 2011-04-03 16:01:48
將分隔符附加到項目的末尾會不會是一個問題? (如果你知道如何分割不包括分隔符) – 2011-04-03 16:09:34
是的,對不起,foo =「something」將是正確的語法。謝謝!如果數據中有空白,則 – Dave 2011-04-03 22:17:08