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/awk
awk のように動作することを期待しています。そうでない場合は、システムが壊れています。