让awk使用字符类

时间:2012-03-28 11:32:26

标签: regex awk character-class

如何让awk识别角色类?

例如,这个:

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

按预期输出1,但是:

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

在我希望12都能在过滤器中存活的地方输出任何内容。

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

1 个答案:

答案 0 :(得分:10)

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

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

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


<强>更新

正如评论中所指出的,Linux的某些发行版可能已安装mawk,伪装成awk。 mawk和awk不一样。它是一个功能最小的awk克隆,专为执行速度而非功能而设计。尽管claims in its man page它支持扩展正则表达式,但mawk无法实现POSIX&#34;类&#34;,如[:digit:][:upper:][:lower:]等。< / p>

如果您运行提供非mawk等非标准工具的系统来代替标准工具,那么您应该期望生活在有趣的时代。 Awk脚本的开发人员希望/usr/bin/awk处的任何二进制文件都像awk一样。如果没有,系统就会崩溃。