4

如何让 awk 识别字符类?

例如,这个:

echo "a\n1\nb\n2\nc" | awk '/1/'

按预期输出1,但是:

echo "a\n1\nb\n2\nc" | awk '/\d/'

在我期望的地方没有输出任何东西,1并且2在过滤器中存活下来。

我认为这可能与外壳转义(zsh)有关,但awk '/\\d/'也不起作用。

4

1 回答 1

10

您可以尝试使用拼写字符类:

[ghoti@pc ~]$ printf "a\n1\nb\n2\nc\n" | awk '/[[:digit:]]/'
1
2
[ghoti@pc ~]$ 

据我所知,符号 like\d实际上并不是 ERE 的一部分,ERE 是大多数 awk 变体(以及The One True awk)都能理解的正则表达式方言。


更新

正如评论中指出的那样,可能已经mawk安装了一些 Linux 发行版,伪装成awk. mawk 与 awk 不同。它是一个功能最少的 awk 克隆,旨在提高执行速度而不是功能。尽管在其手册页中声称它支持扩展正则表达式,但 mawk 未能实现 POSIX“类”,如[:digit:], [:upper:],[:lower:]等。

如果您运行的系统提供非标准工具(例如mawk代替标准工具),那么您应该期望生活在有趣的时代。Awk 脚本的开发人员希望任何二进制文件的/usr/bin/awk行为都像 awk。如果没有,则系统已损坏。

于 2012-03-28T11:41:38.370 回答