使awk使用字符类



如何使awk识别字符类?

例如:

echo "an1nbn2nc" | awk '/1/'

按预期输出1,但这是:

echo "an1nbn2nc" | awk '/d/'

在我期望CCD_ 2和CCD_。

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

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

[ghoti@pc ~]$ printf "an1nbn2ncn" | awk '/[[:digit:]]/'
1
2
[ghoti@pc ~]$ 

据我所知,像d这样的符号实际上并不是ERE的一部分,ERE是大多数awk变体(以及the One True awk)所理解的regex方言。


更新

正如评论中所指出的,Linux的一些发行版可能安装了mawk,伪装成awk。mawk和awk不一样。它是一个功能最小的awk克隆,设计用于执行速度而非功能。尽管mawk在其手册页中声称它支持扩展正则表达式,但它未能实现POSIX"类",如[:digit:][:upper:][:lower:]等。

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

最新更新