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

15 浏览
0 Comments

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

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

awk '{ gsub(/a(b*)c/, "这里有蜜蜂:\\1"); print; }'

这应该将"abbbc"转换为"这里有蜜蜂:bbb"。至少在我使用的Ubuntu 9.04中,它并没有实现。相反,"\1"被渲染为^A;也就是说,它是具有代码1的字符。当然,这不是我想要的。我该如何做到这一点?

谢谢。

0
0 Comments

GNU awk中的gensub函数提供了一个在sub和gsub中不可用的额外功能:在替换文本中指定正则表达式的组件。这是通过在正则表达式中使用括号标记组件,然后在替换文本中指定“\N”的方式来实现的,其中N是从1到9的数字。

然而,由于gensub不会就地修改字符串,因此在使用gensub时必须将结果保存在一个变量中。

因此,解决这个问题的方法是使用gensub函数,并在正则表达式中使用括号来指定组件,然后在替换文本中使用“\N”来引用这些组件。同时,还需要指定“g”标志来表示全局替换。

下面是一个示例代码,演示了如何使用gensub函数:

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

0
0 Comments

在GNU awk中,有一个问题是在替换文本中无法访问捕获的组。问题的解决方法是使用gensub()函数来替代gsub()函数。gensub()函数提供了一个额外的功能,该功能在sub()或gsub()函数中是不可用的:在替换文本中指定正则表达式的组件。这可以通过在正则表达式中使用括号来标记组件,然后在替换文本中使用‘\N’来指定,其中N是从1到9的数字。

另外,不仅gsub()和gensub()在返回值方面表现不同,而且整个\1到\9的特性只能在gensub()中使用。如果尝试使用echo xxxabbcxxx,awk的解决方法就会出错。

但是,在我的理解中,这个解决方法完全按预期工作。我认为这个解决方法没有问题。它进行了替换,然后返回了完整的变量。

对于如何获得整个搜索匹配文本的方法,值得知道:与sub()函数一样,您必须键入两个反斜杠才能将一个反斜杠添加到字符串中。在替换文本中,序列‘\0’表示整个匹配的文本,字符‘&’也表示整个匹配的文本。

,GNU awk中的问题是在替换文本中无法访问捕获的组,解决方法是使用gensub()函数代替gsub()函数,并使用‘\N’来指定正则表达式中的组件。此外,只有gensub()函数支持\1到\9的特性。

0