【发布时间】:2012-01-10 16:46:44
【问题描述】:
echo xx y11y rrr | awk '{ if ($2 ~/y[1-5]{2}y/) print $3}'
为什么我不能得到任何输出?
谢谢。
【问题讨论】:
-
你期待什么输出?
echo xx y11y rrr | awk '{ if ($2 ~/y[1-5]{2}y/) print $3}'
为什么我不能得到任何输出?
谢谢。
【问题讨论】:
在我的机器上:
$ echo xx y11y rrr | awk '{ if ($2 ~/y[1-5]{2}y/) print $3}'
rrr
这是你想要的吗?我在 Windows XP 上的 Cygwin 中使用 GNU awk 4.0.0。
【讨论】:
4.0.0 中删除了指定 --re-interval 以支持区间表达式的需要。
您应该强制 POSIX 在 awk 中使用 {}
echo xx y11y rrr | awk -W posix '{ if ($2 ~/y[1-5]{2}y/) print $3}'
【讨论】:
您需要通过指定--posix 或--re-interval 选项在正则表达式匹配中启用“间隔表达式”。
例如
echo xx y11y rrr | awk --re-interval '{ if ($2 ~ /y[1-5]{2}y/) print $3}
来自手册页:
--重新间隔 在正则表达式匹配中启用区间表达式(请参阅下面的正则表达式)。区间表达式是 传统上不可用 AWK 语言。 POSIX 标准添加了它们,以使 awk 和 egrep 彼此一致。然而,它们的用途是 可能会破坏旧的 AWK 程序,所以 gawk 仅在使用此选项请求它们或指定 --posix 时才提供它们。
【讨论】:
{}expression怎么办?
[1-5]{2},而不是[1-5][1-5]。
--re-interval 或--posix 标志,否则{2} 等区间表达式将不起作用。
gawk (GNU awk)。快速更新:因为gawk 4.0 你不再需要--re-interval。