在bash脚本中将字符串拆分为数组

时间:2016-01-07 23:48:01

标签: bash shell awk

我需要将字符串拆分为数组。 这是我的字符串

`Dec 10 03:39:13 cgnat2.dd.com 1 2015年12月9日14:39:11 01-g3-adsl - - NAT44 -

[UserbasedW - 100.70.24.236 vrf-testnet - 222.222.34.65 - 3072 4095 - - ]

[UserbasedW - 100.70.25.9 vrf-testnet - 222.222.34.65 - 16384 17407 - - ]

[UserbasedW - 100.70.25.142 vrf-testnet - 222.222.34.69 - 9216 10239 - - ]`

我的输出数组应该是

Dec 10 03:39:13 cgnat2.dd.com 1 2015 Dec 9 14:39:11 01-g3-adsl - - NAT44 - [UserbasedW - 100.70.24.236 vrf-testnet - 222.222.34.65 - 3072 4095 - - ] [UserbasedW - 100.70.25.9 vrf-testnet - 222.222.34.65 - 16384 17407 - - ] [UserbasedW - 100.70.25.142 vrf-testnet - 222.222.34.69 - 9216 10239 - - ]

我该怎么做?

2 个答案:

答案 0 :(得分:1)

有很多方法可以分离成阵列。在bash中,你有命令替换 herestrings ,这使得它相对无痛。您需要控制分词,您可以通过将内部字段分隔符设置为仅在换行符上中断来执行此操作。要将分离的字符串加载到数组中,您有几个选项。假设你有一个包含在名为string的变量中的字符串,你可以做类似于以下的事情。

oifs="$IFS"     ## save current Internal Field Separator
IFS=$'\n'       ## set to break on newline only

## separate string into array using sed and herestring
array=( $(sed 's/[ ][[]/\n[/g' <<<"$string") )

IFS="$oifs"     ## restore original IFS

这不是解决问题的唯一方法。您还可以使用流程替换以及read将每个分隔的行添加到数组中,并使用... while read -r line; do array+=("$line"); done < <(sed ...)方法。

答案 1 :(得分:0)

目前还不完全清楚你要做什么,但是下面的管道确实将你的字符串拆分到方括号定义的边界:

sed -e $'s/\\(\\]\\)/\\1\t/g' -e $'s/\\(\\[\\)/\t\\1/g'  | tr '\t' '\n' | grep -v '^$'

输出:

Dec 10 03:39:13 cgnat2.dd.com 1 2015 Dec 9 14:39:11 01-g3-adsl - - NAT44 -
[UserbasedW - 100.70.24.236 vrf-testnet - 222.222.34.65 - 3072 4095 - - ]
[UserbasedW - 100.70.25.9 vrf-testnet - 222.222.34.65 - 16384 17407 - - ]
[UserbasedW - 100.70.25.142 vrf-testnet - 222.222.34.69 - 9216 10239 - - ]