我想知道是否有一种简单的方法将字符串拆分成数组并包含分隔符?
例如:
foo = "a;b;c;d;"
将解析为:
"a;" "b;" "c;" "d;"
似乎大多数功能剥离了分隔符。
编辑:我最终不需要使用echoed输出,而是一个我可以稍后在脚本中操作的数组。此外,如果可以从文本文件中读取字符串,这可能是最简单的。
答案 0 :(得分: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 :(得分: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
这非常糟糕,但是,嘿,它有点工作。
,如果输入中有空格,则需要使用不同的分隔符。答案 2 :(得分:1)
foo='foo bar;abc def;ghi;jlk;'
oldIFS="$IFS"
IFS=\;
declare -a ary=($foo)
for ((i=0; i<${#ary[@]}; i++)); do ary[$i]="${ary[$i]}$IFS"; done
IFS="$oldIFS"
echo "${ary[1]}" # ==> "abd def;"
答案 3 :(得分: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;
答案 4 :(得分: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"
)