如何让awk识别角色类?
例如,这个:
echo "a\n1\nb\n2\nc" | awk '/1/'
按预期输出1
,但是:
echo "a\n1\nb\n2\nc" | awk '/\d/'
在我希望1
和2
都能在过滤器中存活的地方输出任何内容。
我认为这可能与shell转义(zsh)有关,但awk '/\\d/'
也不起作用。
答案 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一样。如果没有,系统就会崩溃。