按子字符串拆分字符串并将其放入数组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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby 中拆分分隔字符串并将其转换为数组?

Lua拆分字符串并将输出放入表中

Vertica:将字符串拆分为数组并将其分组以获取一组唯一值?

Java:拆分字符串并将它们放入文本区域的

拆分所有列表框元素并将它们全部添加到新的字符串数组中

BASH - 如何从 CSV 文件中的列中提取数据并将其放入数组中?