如何让 awk 识别字符类?
例如,这个:
echo "a\n1\nb\n2\nc" | awk '/1/'
按预期输出1
,但是:
echo "a\n1\nb\n2\nc" | awk '/\d/'
在我期望的地方没有输出任何东西,1
并且2
在过滤器中存活下来。
我认为这可能与外壳转义(zsh)有关,但awk '/\\d/'
也不起作用。
如何让 awk 识别字符类?
例如,这个:
echo "a\n1\nb\n2\nc" | awk '/1/'
按预期输出1
,但是:
echo "a\n1\nb\n2\nc" | awk '/\d/'
在我期望的地方没有输出任何东西,1
并且2
在过滤器中存活下来。
我认为这可能与外壳转义(zsh)有关,但awk '/\\d/'
也不起作用。
您可以尝试使用拼写字符类:
[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。如果没有,则系统已损坏。