grepコマンドで[:digit:]を[0-9]に変更できますか?

grepコマンドで[:digit:]を[0-9]に変更できますか?

grep [0-9]同じように動作しますかgrep [:digit:]

答え1

[0-9]いいえいいえと同じです[:digit:]

[0-9]0から9までの数字と一致します。

[:digit:]0 ~ 9 と非西欧言語(東アラビア語など)の数字と一致します。

答え2

[[:digit:]]内部の説明を変更できます[0-9]。これは入力エンコーディングによって異なります。 ASCIIなら問題ないようです。他のエンコーディングでは、数字が連続していないか、バイト範囲が異なる場合があります。他の書き込みシステムでは、特殊数字が欠落している可能性があります。[:digit:][…]

答え3

正確に言うと、次の場合[0-9]にのみ同じであることが保証されます[:digit:]

  • 正規表現パーサーはこれをサポートします[:digit:](つまり、そうでない場合、既存のパーサーは[:digit:]おそらくあなたが思うように実行しません)。そして:

  • 入力文字セットはASCIIと同じ文字セットで、数字だけが文字で0互いに9隣接しています。 (たとえば)Unicode(数字に数字0以外の文字を含めることができる場合9)または他の8ビット文字セットでも隣接しない可能性があります09EBCDIC数字0-9隣接)。

Unicode 例外を示す例ここ。ご覧のとおり、「数字、数字、小数」カテゴリのUnicode文字セットには、[0-9]10個のASCII数字と一致する以上のものが含まれています。これには、アラビア語、インド人、拡張アラビア語、NGOなどが含まれます。

Unicode 番号の詳細については、次をご覧ください。ここ

答え4

'[:数値:]'はい理論的にクラスター番号を一緒に設定するためにローカル文字セットに依存しないという利点があり、移植性に優れています。

関連例:「[:upper:]」と「[AZ]」の間にASCIIの違いはありませんが、はい既存のIBMとの違いEBCDICここで、「[AZ]」は26文字(EBCDICコード193-233)ではなく41文字に拡張されるため、EBCDIC "}\"などと一致します。

関連情報