awk和正则表达式的简单问题

时间:2011-12-01 14:37:58

标签: regex shell awk gawk

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

为什么我无法获得任何输出?

谢谢。

3 个答案:

答案 0 :(得分:8)

您需要通过指定--posix--re-interval选项在正则表达式匹配中启用“区间表达式”。

e.g。

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

从手册页:

  

- 重间隔          允许在正则表达式匹配中使用区间表达式(请参阅下面的正则表达式)。区间表达式是   不是传统的          AWK语言。 POSIX标准添加了它们,使awk和egrep相互一致。但是,它们的用途是   可能打破旧的AWK程序,所以          如果使用此选项请求它们,或者指定了--posix,则gawk仅提供它们。

答案 1 :(得分:0)

在我的机器上:

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

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

答案 2 :(得分:0)

你应该强迫POSIX在awk中使用{}

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