awk和regex的简单问题

awk和regex的简单问题,regex,shell,awk,gawk,Regex,Shell,Awk,Gawk,为什么我不能得到任何输出 谢谢。在我的机器上: echo xx y11y rrr | awk '{ if ($2 ~/y[1-5]{2}y/) print $3}' 这是你想要的吗?我在Windows XP的Cygwin中使用GNU awk 4.0.0。您应该强制POSIX在awk中使用{} $ echo xx y11y rrr | awk '{ if ($2 ~/y[1-5]{2}y/) print $3}' rrr 您需要通过指定--posix或--re interval选项在正则表达

为什么我不能得到任何输出

谢谢。

在我的机器上:

 echo xx y11y rrr | awk '{ if ($2 ~/y[1-5]{2}y/) print $3}'

这是你想要的吗?我在Windows XP的Cygwin中使用GNU awk 4.0.0。

您应该强制POSIX在awk中使用{}

$ echo xx y11y rrr | awk '{ if ($2 ~/y[1-5]{2}y/) print $3}'
rrr
您需要通过指定
--posix
--re interval
选项在正则表达式匹配中启用“interval expressions”

e、 g

从手册页:

--重新间隔 在正则表达式匹配中启用区间表达式的使用(请参见下面的正则表达式)。区间表达式为 传统上不适用于 AWK语言。POSIX标准添加了它们,以使awk和egrep彼此一致。然而,它们的用途是有限的 可能会破坏旧的AWK程序,所以 gawk仅在使用此选项请求它们或指定--posix时提供它们


您希望得到什么输出?呃,我仍然无法从您的答案中获得任何输出。似乎是操作系统特有的问题为了支持间隔表达式而指定
--re interval
的需要已在gawk
4.0.0
中删除。您尝试使用POSIX regexp功能,但awk使用它自己的regexp格式。因此,您应该强制使用regexp的POSIX格式。再看看dogbane的答案。如果不使用
{}
表达式,我该怎么办?你可以使用
[1-5]{2}
,而不是
[1-5][1-5]
。不,区间表达式,比如
{2}除非使用
--re interval
--posix
标志,否则
将不起作用。您不需要退出大括号。为了明确起见:这仅适用于
gawk
(GNU
awk
)。快速更新:由于
gawk4.0
您不再需要
--re interval
echo xx y11y rrr | awk -W posix '{ if ($2 ~/y[1-5]{2}y/) print $3}'
echo xx y11y rrr | awk --re-interval '{ if ($2 ~ /y[1-5]{2}y/) print $3}