按子字符串拆分字符串并将其放入数组bash
Posted
技术标签:
【中文标题】按子字符串拆分字符串并将其放入数组bash【英文标题】:Spliting string by substring and putting it to array bash 【发布时间】:2020-09-06 11:05:53 【问题描述】:如何使用 bash 通过子字符串拆分字符串并将结果放入数组中?根据系统输入,字符串可能包含不同数量的子字符串。到目前为止,我在没有系统输入的情况下测试了和平 od 代码
String1="SuperDomain/Off/01|stack SuperDomain/Off/03|apply"
echo $String1 | awk 'split($0,a,"SuperDomain"); print a[1]'
它没有显示任何东西。我想使用整个数组,实际上不知道我从输入中得到的许多子字符串。
【问题讨论】:
它显示了一些东西。它显示了一个空字段,这就是您在示例字符串中的内容。for (i in a) print a[i]
也许?
好的,那怎么解决呢?
最终数组的元素是否总是由空格分隔,而您只想删除第一个 / 之前的部分?
您要查找的字符串位于数组中的以下位置。 a[2]
和 a[3]
【参考方案1】:
由于根据您的示例代码,您显然愿意使用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
选项的参数)被解释为正则表达式。因此,如果您想沿包含特殊正则表达式字符的固定分隔符拆分字符串,则必须转义它们。
【讨论】:
【参考方案2】:要求并不完全清楚。从示例输入中,我会将要求解读为
仅使用 bash 将输入拆分为空格分隔的标记 对于每个标记,通过剥离前导“SuperDomain”前缀来提取数据 放入 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]="/Off/01|stack" [1]="/Off/03|apply")
【讨论】:
以上是关于按子字符串拆分字符串并将其放入数组bash的主要内容,如果未能解决你的问题,请参考以下文章