私はこの表現が[c1-c2]
orで使用されたときに何をするかを理解しようとしています。sed
grep
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
。