使用多字符定界符将字符串拆分为数组

时间:2018-10-10 15:05:24

标签: arrays string bash

我需要将字符串拆分为数组。我的问题是定界符是3个字符:_-_
例如:

db2-111_-_oracle12cR1RAC_-_mariadb101

我需要创建以下数组:

db2-111
oracle12cR1RAC
mariadb101

类似的问题也遵循这种方法:

str="db2-111_-_oracle12cR1RAC_-_mariadb101"
arr=(${str//_-_/ })
echo ${arr[@]}

即使创建了数组,也无法正确拆分它:

db2 
111 
oracle12cR1RAC 
mariadb101

似乎第一项中的“-”字符导致数组的split函数失败。 您可以提出解决方案吗?谢谢

3 个答案:

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