gawk 中的正则表达式出现问题('\

gawk 中的正则表达式出现问题('\

我正在尝试稍微了解一下 bash。我正在经历本指南但第二个例子本小节在 gawk 上似乎不起作用。

问题是这个命令:

ls -l | awk '/\<(a|x).*\.conf$/ { print $9 }'

\<仅当我替换为空格时它才有效。我也尝试过使用\y,但也没有运气。

有谁知道这里可能出现什么问题吗?

谢谢 :)

答案1

GNUawk手册 (秒。 3.5) 记录了正则表达式\<是特定于 gawk 的,因此不应期望它能在其他实现中工作。

根据man mawk,如果在非特殊字符前面放置反斜杠,则反斜杠将被删除。因此,under mawk,\<被简单地解释为尖括号字符。

例子

我简化了正则表达式以提供不同行为的示例:

$ echo -e " a\n ab.conf\n <ac.conf" | gawk '/\<(a|x)/ { print}'
 a
 ab.conf
 <ac.conf
$ echo -e " a\n ab.conf\n <ac.conf" | mawk '/\<(a|x)/ { print}'
 <ac.conf

同样,gawk将其解释\<为单词的开头,而mawk将其简单地解释为尖括号。

POSIX 对于这个问题是怎么说的

GNUawk手册解释:

如果您在字符串常量中将反斜杠放在不属于前面列出的字符之一的字符之前,POSIX awk 会故意将发生的情况保留为未定义。

换句话说,在这种情况下,不同的awk解释者可以自由地做出自己的决定。

相关内容