40

这似乎应该很简单,但是我一直不清楚 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 的字符。当然,这不是我想要的。我该怎么做呢?

谢谢。

4

2 回答 2

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

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

于 2009-10-12T15:39:21.503 回答
26

根据 gawk 手册

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

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

awk '{ r = gensub(/a(b*)c/, "Here are bees: \\1", "g"); print r; }'
于 2009-10-12T16:08:19.853 回答