spr*_*aff 4 regex awk character-class
如何让awk识别字符类?
例如,这个:
echo "a\n1\nb\n2\nc" | awk '/1/'
Run Code Online (Sandbox Code Playgroud)
1按预期输出,但这个:
echo "a\n1\nb\n2\nc" | awk '/\d/'
Run Code Online (Sandbox Code Playgroud)
没有输出任何我期望的东西,1并2在过滤器中存活.
我认为这可能与shell转义(zsh)有关,但awk '/\\d/'也无效.
gho*_*oti 10
您可以尝试使用拼写出的字符类:
[ghoti@pc ~]$ printf "a\n1\nb\n2\nc\n" | awk '/[[:digit:]]/'
1
2
[ghoti@pc ~]$
Run Code Online (Sandbox Code Playgroud)
据我所知,符号\d并不是ERE的一部分,ERE是大多数awk变体(以及The One True Awk)所理解的正则表达方言.
更新:
正如在评论中指出的那样,Linux的一些发行版可能已经mawk安装,伪装成awk.mawk和awk不一样.它是一个功能最小的awk克隆,专为执行速度而非功能而设计.而且,尽管在它的手册页索赔,它支持扩展正则表达式,mawk不执行POSIX"类",如[:digit:],[:upper:],[:lower:],等.
如果您运行的系统提供非标准工具,而不是标准工具mawk,那么您应该期望生活在有趣的时代.Awk脚本的开发人员希望任何二进制文件都/usr/bin/awk像awk一样.如果没有,系统就会崩溃.