GNU awk:在替换文本中访问捕获的组

时间:2009-10-12 15:17:46

标签: gawk

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

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

那应该将“abbbc”变成“这里有蜜蜂:bbb”。在Ubunutu 9.04中,它至少不适合我。相反,“\ 1”呈现为^ A;也就是说,代码的字符1.当然不是我想要的。我该怎么做?

感谢。

2 个答案:

答案 0 :(得分:25)

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

请参阅手册here,了解gsub和gensub

之间的区别

答案 1 :(得分:23)

根据gawk手册

  

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

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

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