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 の一部ではありません。これは、ほとんどの awk バリアント (およびThe One True Awk ) によって理解される正規表現の方言です。
更新:
コメントで指摘されたように、Linux の一部のディストリビューションはmawk、 として偽装してインストールされている可能性がありawkます。mawk は awk と同じではありません。これは最小限の機能しか持たない awk クローンであり、機能よりも実行速度を重視して設計されています。また、拡張正規表現をサポートしているというマニュアル ページでの主張にもかかわらず、mawk は[:digit:]、[:upper:]、[:lower:]などの POSIX「クラス」の実装に失敗しています。
標準ツールの代わりに非標準ツールを提供するシステムを実行している場合mawkは、興味深い時代に生きていることを期待する必要があります。Awk スクリプトの開発者は、任意のバイナリが/usr/bin/awkawk のように動作することを期待しています。そうでない場合は、システムが壊れています。