【问题标题】:Spliting string by substring and putting it to array bash按子字符串拆分字符串并将其放入数组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]

标签: bash awk split


【解决方案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")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 2020-08-26
      相关资源
      最近更新 更多