【问题标题】:awk regular expression not workingawk 正则表达式不起作用
【发布时间】:2016-05-13 13:18:00
【问题描述】:

我正在尝试查看用户创建的文件是否具有 LX***** 模式,其中 * 都是数字。我正在使用 awk,但它似乎不正确。

这是有效的

<command_to_print_files> | awk '{ if ($1 ~ /^LX[0-9][0-9][0-9][0-9][0-9]$/) print $1"\t"$4}' 

这不是

<command_to_print_files> | awk '{ if ($1 ~ /^LX[0-9]{5}$/) print $1"\t"$4}'

为什么?鉴于我将使用 awk,而不是任何其他命令,我怎样才能使它工作。提前致谢。

【问题讨论】:

  • 第二个 awk 脚本对我有用——在 Mac OS X 10.11.4 上使用 BSD Awk 和 GNU Awk (4.1.3)。 (给定LX99999 D E F,它打印LX99999 F;给定LX8888 A B CLX000000 X Y Z,它什么也没打印。)您在哪个平台上使用哪个版本的Awk?请注意,如果您愿意,可以使用 awk '$1 ~ /^LX[0-9]{5}$/ {print $1"\t"$4}'
  • GNU Awk 3.1.7 :( @JonathanLeffler。感谢您提供的信息。
  • 我的机器上碰巧有 GNU Awk 3.1.7 的源代码,所以我编译它并确认它不能识别 GNU Awk 4.1.3 识别的模式。如果您希望符号工作,是时候升级了。
  • RE 间隔在 gawk 4.0 之前默认被禁用(以前你需要 --re-interval 来启用它们)。获取新版本的 gawk,因为您当前的版本已经过时了几年,并且您缺少大量非常有用的功能(请参阅 gnu.org/software/gawk/manual/gawk.html#Feature-History

标签: bash awk


【解决方案1】:

Mac OS X awk (BSD awk) 应该与:

ls| awk '/^LX[0-9]{5}/ {print $1}'

<command_to_print_files> | awk '{ if ($1 ~ /^LX[0-9]{5}$/) print $1"\t"$4}'

但是GNU awk 不支持(版本>4 支持它)。

要在正则表达式 GNU awk 中使用 {},请使用 --re-interval--posix

这应该适合你:

<command_to_print_files> | awk --re-interval '{ if ($1 ~ /^LX[0-9]{5}$/) print $1"\t"$4}'

ls| awk --re-interval '/^LX[0-9]{5}/ {print $1}'

注意(来自Ed Morton's 评论):使用--re-interval 而不是--posix,因为后者会禁用所有 gawk 扩展(例如 gensub() )

【讨论】:

  • 工作。谢谢:)
  • 您使用的是哪个版本的 GNU Awk?它适用于 GNU Awk 4.1.3 但不适用于 3.1.7 — 没有 --re-interval--posix 选项。
  • 使用--re-interval而不是--posix,因为后者会禁用所有gawk扩展,例如gensub().
  • @JonathanLeffler 是的,新的支持{..}。由于大多数人不会更新他们随操作系统获得的 GNU AWK,因此它仍然过时并且不支持在 RegEx 中使用花括号。
猜你喜欢
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多