如何使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。如果没有,系统就坏了。