【问题标题】:GNU awk: accessing captured groups in replacement textGNU awk:访问替换文本中捕获的组
【发布时间】:2010-12-06 00:36:30
【问题描述】:

这看起来应该很简单,但是我一直不清楚 awk gensub/gsub/sub 的行为,现在我无法让它按照文档所说的去做(以及什么经验与无数其他类似的工具建议应该可以工作)。具体来说,我想从替换字符串中的正则表达式访问“捕获的组”。我认为 awk 语法应该是这样的:

awk '{ gsub(/a(b*)c/, "Here are bees: \1"); print; }'

这应该将“abbbc”变成“Here are bees: bbb”。它没有,至少在 Ubunutu 9.04 中对我来说不是。相反,“\1”呈现为 ^A;也就是说,代码为 1 的字符。当然,这不是我想要的。我该怎么做?

谢谢。

【问题讨论】:

    标签: gawk


    【解决方案1】:
    echo abbc | awk '{ print gensub(/a(b*)c/, "Here are bees: \\1", "g", $1);}'
    

    查看手册here了解gsub和gensub的区别

    【讨论】:

    • 此外,不仅 gsub 和 gensub 在返回值方面的行为不同,而且整个 \1 到 \9 功能适用于 gensub。
    • 尝试echo xxxabbcxxx - awk“解决方案”中断
    • @Alesandr,请随意提出新的建议
    • @AleksandrLevchuk 您的示例完全按预期工作。我认为这个解决方案没有任何问题。它进行替换,然后返回完整的变量。
    • 看到有人说一种语言“被破坏”了,因为他们不理解语法或阅读手册,这让我很开心!
    【解决方案2】:

    根据 gawk 手册

    gensub 提供了一个附加功能 在 sub 或 gsub 中不可用: 指定组件的能力 替换文本中的正则表达式。这 是通过在 正则表达式标记组件,然后 在替换中指定'\N' 文本,其中 N 是从 1 到 9 的数字。

    你必须使用gensub,你必须指定“g”,你必须抓取gensub的结果,因为它不会就地修改。

    awk '{ r = gensub(/a(b*)c/, "Here are bees: \\1", "g"); print r; }'
    

    【讨论】:

      猜你喜欢
      • 2018-04-27
      • 2011-02-26
      • 2017-12-05
      • 1970-01-01
      • 2016-01-28
      • 2021-02-13
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多