按子字符串分割字符串并将其放入数组bash

时间:2020-05-20 07:07:20

标签: bash awk split

如何使用bash按子字符串拆分字符串并将结果放入数组中?该字符串可能包含不同数量的子字符串,具体取决于系统输入。到目前为止,我没有系统输入的睾丸和平od码

String1="SuperDomain/Off/01|stack SuperDomain/Off/03|apply"
echo $String1 | awk '{split($0,a,"SuperDomain"); print a[1]}'

,它什么也没显示。我想使用整个数组,实际上我不知道我从输入中获得了多少子字符串。

2 个答案:

答案 0 :(得分:0)

由于根据您的示例代码,您显然愿意使用awk(尽管在您的问题中,您要求的是bash解决方案),所以该示例将在您的具体示例中起作用:

arr=( $(awk -F SuperDomain '{ print $2; print $3 }' <<<"$String1") )

这将用元素arr/Off/01|stack填充bash数组/Off/03|apply。对于一般情况(即,如果您不像示例中那样仅对字段2和3感兴趣),您当然会编写awk循环以打印出所有字段。

执行此操作时,您需要确定如何处理空白字段。例如,如果String1包含'SuperDomainfooSuperDomainSuperDomainbar',则需要确定生成的bash数组应包含2个元素(“ foo”,“ bar”)还是3个或4个元素。

该方法要记住的另一点是,awk的字段分隔符(即-F选项的参数)被解释为正则表达式。因此,如果您想沿着包含特殊regexp字符的固定分隔符分解字符串,则必须将其转义。

答案 1 :(得分:0)

要求不完全清楚。从样本输入中,我将需求读取为

  • 仅使用bash
  • 将输入拆分为以空格分隔的令牌
  • 对于每个令牌,通过剥离开头的“ SuperDomain”前缀来提取数据
  • 放入Bash数组

请注意,这是“纯扑”的解决方案-没有awk,sed或外部程序。

String1="SuperDomain/Off/01|stack SuperDomain/Off/03|apply"
# Split into array
read -a data <<< "$String1"

# Strip the prefix from each element
a=( "${data[@]#SuperDomain}" )

# Show the final array
declare -p a

结果: 声明-a a =([0] =“ / Off / 01 | stack” [1] =“ / Off / 03 | apply”)