GNU awk 是否接受在正则表达式中使用括号指定的间隔?

GNU awk 是否接受在正则表达式中使用括号指定的间隔?

awk 识别哪些类型的正则表达式?此命令

echo "aa" | gawk '/a{2,3}/ {print}'

不返回任何内容,而

echo "a{2,3}" | gawk '/a{2,3}/ {print}'

返回a{2,3}

由于其他扩展的正则表达式功能(如交替)也可以被识别,我在哪里可以找到准确的参考?从GNUfind手册中有关 awk 正则表达式的部分,上述语法应该被接受,因为:

间隔由“{”和“}”指定。

答案1

手册

最初,由于旧程序可能在正则表达式常量中使用“{”和“}”,因此 gawk 无法匹配正则表达式中的区间表达式。

但是,从 4.0 版开始,gawk 默认匹配区间表达式。这是因为对于大多数 gawk 用户来说,与 POSIX 的兼容性比与旧程序的兼容性更重要。

自从Ubuntu 12.04 有 GNU awk 3.1.8,14.04 有 4.0.1,您必须使用的是 12.04 (或其他类似的旧版本)。


设置POSIXLY_CORRECTPOSIX 行为:

$ echo "a{2,3}" | POSIXLY_CORRECT=1 gawk '/a{2,3}/ {print}'
$ echo "aa" | POSIXLY_CORRECT=1 gawk '/a{2,3}/ {print}'
aa

或者,-r如果您想保留 GNU 扩展并使用区间表达式,请使用该选项:

-r
--re-interval

允许区间表达式(见正则表达式运算符) 在正则表达式中。这现在是 gawk 的默认行为。尽管如此,此选项仍保留(既为了向后兼容,也为了与 结合使用 --traditional)。

相关内容