【问题标题】:Using sed to replace delimited lists inside larger body of text使用 sed 替换较大正文中的分隔列表
【发布时间】:2013-12-30 19:56:08
【问题描述】:

我有一个大文件,在方括号中包含许多可变长度的数字列表实例,每行最多一个列表,列表永远不会为空,例如:

[1, 45, 54, 78] 或 [32]

我想去掉方括号和逗号,例如:

1 45 54 78 或 32

我可以成功地将它们与 sed 中的这个正则表达式匹配:

\\[\\([0-9]*\\)\\(, \\([0-9]*\\)\\)*\\]

但我不知道如何使用组号来指代我想要的组,例如正在做:

sed  's/\\t\[\\([0-9]*\\)\\(, \\([0-9]*\\)\\)*\\]/\\t\\1 \\3/g'

只会导致目标文件获取列表中的第一个和最后一个数字。

(我确实使用 awk 解决了我的问题,但我想知道是否可以使用 sed 来解决)

有没有办法在 sed 中引用可变数量的组?

【问题讨论】:

  • 不明白如果每行只有一个匹配项,为什么会有“可变数量的组”?您能否展示您的 awk 解决方案 - 也许这会解决问题。
  • 如果同一文件中还有[abc, foo] 怎么办?

标签: regex list sed variable-length


【解决方案1】:

怎么样:

sed 's/\[([\d ,]+)\]/\1/g' | sed 's/,//g'

两个单独的命令 - 第一个提取“方括号内的内容”,第二个去除逗号。

【讨论】:

    【解决方案2】:

    这个awk 应该这样做:

    awk '{gsub(/[][,]/,x)}1' file
    1 45 54 78 or 32
    

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed -r ':a;/\[([0-9]+(, )*)+\]/!b;s//\n&\n/;h;s/[][,]//g;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/;ba' file
      

      这会找到模式,在两边用换行符标记它,并将整行复制到保留空间。然后它删除模式中的括号和逗号,并将更改后的模式与原始模式重新组合,然后重复直到找不到更多模式。

      【讨论】:

        猜你喜欢
        • 2020-10-13
        • 2015-05-12
        • 1970-01-01
        • 2021-10-25
        • 2013-05-25
        • 1970-01-01
        • 2019-01-28
        • 2016-09-15
        • 1970-01-01
        相关资源
        最近更新 更多