【问题标题】:Simple trouble with awk and regexawk 和正则表达式的简单问题
【发布时间】:2012-01-10 16:46:44
【问题描述】:
 echo xx y11y rrr | awk '{ if ($2 ~/y[1-5]{2}y/) print $3}'

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

谢谢。

【问题讨论】:

  • 你期待什么输出?

标签: regex shell awk gawk


【解决方案1】:

在我的机器上:

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

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

【讨论】:

  • 嗯,你的回答我仍然无法得到任何输出。
  • 似乎是特定于操作系统的问题
  • 在 gawk 4.0.0 中删除了指定 --re-interval 以支持区间表达式的需要。
【解决方案2】:

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

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

【讨论】:

  • 您尝试使用 POSIX-regexp 功能,但 awk 使用它自己的 regexp 格式。所以你应该强制使用正则表达式的 POSIX 格式。也看看dogbane的回答。
【解决方案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
猜你喜欢
  • 1970-01-01
  • 2011-05-13
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
相关资源
最近更新 更多