我需要在多字符分隔符上拆分字符串,并将值返回到Bash中的数组中以便进一步处理
IFS可以采用单个字符分隔符。
a="2;AAAAA;BBBBB;1111_MultiCharDel_2;CCCC;DDDDDD;22222_MultiCharDel_2;EEEE;FFFFFFF;22222"
awk'{split($0,ArrayDeltaMulDep,"_MultiCharDel_")}' <<< $a
输入字符串可以有多个由MultiCharDel分隔符分隔的子字符串。
如何在Bash中访问此数组ArrayDeltaMulDep进一步处理?
答案 0 :(得分:2)
您的示例字符串a
不包含换行符。如果这一般是正确的,那么:
a="2;AAAAA;BBBBB;1111_MultiCharDel_2;CCCC;DDDDDD;22222"
readarray -t b <<< "${a//MultiCharDel/$'\n'}"
我们可以验证是否使用declare -p
正确拆分字符串以显示b
的值:
$ declare -p b
declare -a b=([0]="2;AAAAA;BBBBB;1111_" [1]="_2;CCCC;DDDDDD;22222")
工作原理:
readarray -t b
这将从stdin读取行,然后将其放入bash数组b
。
<<< "${a//MultiCharDel/$'\n'}"
${a//MultiCharDel/$'\n'}
使用模式替换将MultiCharDel
替换为换行符。 <<<
将结果作为stdin提供给命令readarray
。
帽子提示:Chepner
bash字符串永远不会包含空字符(十六进制00)。使用GNU sed:
b=()
while read -d '' -r line
do
b+=("$line")
done < <(sed 's/MultiCharDel/\x00/g; s/$/\x00/' <<<"$a")
这会再次创建一个包含所需拆分的数组:
$ declare -p b
declare -a b=([0]="2;AAAAA;BBBBB;1111_" [1]="_2;CCCC;DDDDDD;22222")