Bash shell脚本 - 拆分字符串包含分隔符?

时间:2011-04-03 15:58:21

标签: bash shell

我想知道是否有一种简单的方法将字符串拆分成数组并包含分隔符?

例如:

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

将解析为:

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

似乎大多数功能剥离了分隔符。

编辑:我最终不需要使用echoed输出,而是一个我可以稍后在脚本中操作的数组。此外,如果可以从文本文件中读取字符串,这可能是最简单的。

5 个答案:

答案 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"
)