【问题标题】:Why does echo 'hello world' | awk '/hello\s/ {print $0}' produce nothing?为什么 echo 'hello world' | awk '/hello\s/ {print $0}' 什么也没产生?
【发布时间】:2016-06-01 03:51:31
【问题描述】:

为什么这个“awk”命令什么也没产生?

   echo 'hello world' | awk '/hello\s/ {print $0}'

我想模式 /hello\s/ 应该匹配任何有 'hello' 后跟空格的行,对吗?

关于信息,我在 Mac OS 中使用 awk。 awk 版本是 20070501。

【问题讨论】:

  • 我这里什么也没产生(GNU awk)。您是否使用了无法识别 \s 的 awk,例如 mawk?
  • \s 是(我认为)由 perl 发明的。您的 awk 使用此处定义的正则表达式:developer.apple.com/library/mac/documentation/Darwin/Reference/…
  • Mawk 是“Mike 的 awk”。不确定 BSD awk,但看起来 \s 是 GNUism。
  • @zell,正则表达式引擎有很多不同的实现。几乎每种编程语言都编写自己的。它们大部分相同,但也有区别。如果您在工具 X 中使用正则表达式,您确实需要查阅 X 的文档
  • @BenjaminW.,我在 re_format 手册页中看到有“增强的”正则表达式,其中包括通常的快捷方式转义,但该工具必须将其作为编译时选项包含在内,并且您希望该工具的文档说明使用增强的正则表达式

标签: regex linux macos awk


【解决方案1】:

这适用于 OS X:

echo 'hello world' | awk '/hello[[:space:]]/ {print $0}'

gawk docs(释义)中所述:

\s 视为[[:space:]] 的简写

您也可以使用[[:blank:]] 来限制空格和制表符。

找不到一些“普通”的 awk 文档。 This seems legit,尽管有页面名称。

【讨论】:

  • 干得好;但是请注意,您正在链接到 GNU Awk 文档页面。 OSX 上的 BSD awk 的手册页引用 man re_format 以获得支持的正则表达式功能,但不幸的是,awk 确实 支持其中描述的所有功能,尤其是不支持 [[:<:]][[:>:]] 用于词边界断言。
  • @glennjackman 找到了man re_format的在线版本:developer.apple.com/library/mac/documentation/Darwin/Reference/…
  • 这是一个旧答案,但我想我会指出,即使 gawk 也无法将 \s 识别为 [[:space:]] until version 4 的简写。我刚刚在安装了 3.1.7 版本的旧 CentOS 6.3 机器上遇到了这个问题。
【解决方案2】:
echo 'hello world' | awk  '/^hello / {print $0}'

这会查找以“hello”开头的每一行

【讨论】:

  • 但只有在后跟空格而不是制表符时,\s 才会匹配。
  • 你是对的。但问题是留白。
  • 是的,但是空格和\s 都包含制表符。
  • 而字符类[:space:][:blank:] 都包含空格和制表符。
猜你喜欢
  • 2011-09-12
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
相关资源
最近更新 更多