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

Poi*_*nty 31 gawk

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

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

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

谢谢.

小智 28

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

请参阅此处的手册以查看gsub和gensub之间的区别

  • 此外,不仅gsub和gensub在返回值方面表现不同,而且整个\ 1到\ 9特征*仅*与gensub一起使用. (5认同)

Jon*_*erg 24

根据gawk手册

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

你必须使用gensub,你必须指定"g",你必须获取gensub 的结果,因为它不会就地修改.

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