4

awk に文字クラスを認識させるにはどうすればよいですか?

たとえば、次のようになります。

echo "a\n1\nb\n2\nc" | awk '/1/'

期待どおりに出力1されますが、これは次のとおりです。

echo "a\n1\nb\n2\nc" | awk '/\d/'

フィルタを生き残るために、両方1を期待した場所には何も出力しません。2

これはシェルエスケープ(zsh)に関係しているのではないかと思いましたがawk '/\\d/'、機能しません。

4

1 に答える 1

10

スペルアウトされた文字クラスを使用してみることができます:

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

于 2012-03-28T11:41:38.370 に答える