将awk split数组返回给bash变量

时间:2016-10-12 22:17:46

标签: arrays bash awk

我需要在多字符分隔符上拆分字符串,并将值返回到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进一步处理?

1 个答案:

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

工作原理:

  1. readarray -t b

    这将从stdin读取行,然后将其放入bash数组b

  2. <<< "${a//MultiCharDel/$'\n'}"

    ${a//MultiCharDel/$'\n'}使用模式替换将MultiCharDel替换为换行符。 <<<将结果作为stdin提供给命令readarray

  3. 帽子提示: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")