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



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

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

它没有显示任何东西。我想使用整个数组,实际上不知道 nie 我从输入中获得的许多子字符串。

由于根据您的示例代码,您显然愿意使用awk(尽管在您的问题中您要求一个 bash 解决方案(,因此这个可以在您的具体示例中工作:

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

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

执行此操作时,您需要下定决心如何处理空字段。例如,如果String1包含'SuperDomainfooSuperDomainSuperDomainbar',您需要决定生成的 bash 数组是否应该有 2 个元素('foo' 'bar'(,或者 3 个或 4 个元素。

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

要求并不完全清楚。从示例输入中,我将要求读取为

  • 仅使用 bash
  • 将输入拆分为空格分隔的标记
  • 对于每个令牌,通过剥离前导"超级域"前缀来提取数据
  • 放入 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]="/关闭/01|堆栈" [1]="/关闭/03|应用"(

最新更新