sed と grep の c1-c2 正規表現

sed と grep の c1-c2 正規表現

私はこの表現が[c1-c2]orで使用されたときに何をするかを理解しようとしています。sedgrep

grep -E "[c1-c2]"

これは1-9とa、b、cと一致します。私が理解したのは、ASCIIテーブルの1とcの間の文字と一致する必要があります。

答え1

[c1-c2]角かっこ表現。指定された形式では、文字「c」、「1」、および「c」(含む)と文字「2」の間の文字範囲と一致します。文字範囲はロケールによって異なります。POSIX ロケールでは、49(「1」のコード)と99(「c」のコード)の間のASCIIコードで構成される文字セットです。したがって:

$ echo : | LANG=C grep -E '[c1-c2]'
:
$ echo 0 | LANG=C grep -E '[c1-c2]'
$ echo A | LANG=C grep -E '[c1-c2]'
A

私は意図がそうであるc1と思ってc2関心の範囲を制限する単一の文字を表すので、[a-m]代わりにそのようなものを書くことになります[c1-c2]

答え2

POSIX / C以外のロケールでは、文字範囲はASCII順序を使用せず、代わりにロケールの組み合わせ順序を使用します。これは通常、ASCIIシーケンスよりも複雑です。基準文字範囲の解釈は未定義で作成されますが(読み取り:アプリケーションによって異なります)、多くのロケールは大文字と小文字を区別するため、次のよう1-cに分類されます。

  • 1-「1」からそのグループの終わりまで(つまり、数字から...1まで9
  • -c小グループから始めるc

(句読点も除く。)

だから私のロケールでは[1-c]次のようになります... [123456789aàâäbc]! (私のキーボードがサポートしているよりも多くの「a」バリエーションがあるかもしれません):

grep -Eo '[c1-c2]+' <<< '01234àâäbc'
1234àâäbc

もちろん、[c1-c2]上記のリストcに含まれているので、同じ項目と一致します2

関連情報