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_CORRECT
POSIX 行为:
$ 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
)。