我需要将字符串拆分为数组。我的问题是定界符是3个字符:_-_
例如:
db2-111_-_oracle12cR1RAC_-_mariadb101
我需要创建以下数组:
db2-111
oracle12cR1RAC
mariadb101
类似的问题也遵循这种方法:
str="db2-111_-_oracle12cR1RAC_-_mariadb101"
arr=(${str//_-_/ })
echo ${arr[@]}
即使创建了数组,也无法正确拆分它:
db2
111
oracle12cR1RAC
mariadb101
似乎第一项中的“-”字符导致数组的split函数失败。 您可以提出解决方案吗?谢谢
答案 0 :(得分:3)
如果可以,请用另一个单个字符替换_-_
序列,该字符可用于字段拆分。例如,
$ str="db2-111_-_oracle12cR1RAC_-_mariadb101"
$ str2=${str//_-_/#}
$ IFS="#" read -ra arr <<< "$str2"
$ printf '%s\n' "${arr[@]}"
db2-111
oracle12cR1RAC
mariadb101
答案 1 :(得分:1)
您可以使用sed
来完成您想要的事情,即编写类似的内容:
str="db2-111_-_oracle12cR1RAC_-_mariadb101"
arr=($(sed 's/_-_/ /g' <<< $str))
echo ${arr[0]}
编辑:
arr=(${str//_-_/ })
不起作用的原因是,当您这样写时,${ ... }
中的所有内容都被视为数组的1个元素。因此,使用sed
甚至简单地使用arr=($(echo ${str//_-_/ }))
都会产生您期望的结果。
答案 2 :(得分:0)
使用Perl单线版
$ echo "db2-111_-_oracle12cR1RAC_-_mariadb101" | perl -F/_-_/ -ne ' { print "$F[0]\n$F[1]\n$F[2]" } '
db2-111
oracle12cR1RAC
mariadb101