LC_COLLATEによる照合順序 個々の文字の並べ替え順序だけでなく、文字範囲の意味も定義します。それともそうですか?次のスニペットについて考えてみます。
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
直感的に、B [a-z]にありません 、したがって、これは何も出力しないはずです。それがUbuntu8.04または10.04で起こることです。ただし、Debian lennyまたはsqueezeを実行している一部のマシンでは、B 範囲がa-zであるため、が見つかりました aの間にあるすべてのものが含まれます およびz 大文字のBを含む照合順序 Zを介して 。
テストされたすべてのシステムには、en_USがあります ロケールが生成されました。また、ロケールを変更してみました:Bがあるマシンで 上記に一致する場合、同じことが利用可能なすべてのロケールで発生します(ほとんどの場合ラテン語ベース:{en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8} 、中国語のロケールも)日本語(使用可能なエンコーディング)とCを除く / POSIX 。
正規表現での文字範囲の意味 、ASCIIを超えたときは?一部のDebianインストールと他のDebianインストールおよびUbuntuに違いがあるのはなぜですか?他のシステムはどのように動作しますか?誰が正しいのか、誰に対してバグを報告する必要があるのか?
(特に、[a-z]などの文字範囲の動作について質問していることに注意してください。 en_USで ロケール、主にGNUlibcベースのシステム。小文字またはASCII小文字を一致させる方法を尋ねていません。)
2台のDebianマシンで、1台はB [a-z]にあります そうでない場合は、LC_COLLATE=en_US locale -k LC_COLLATEの出力
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
およびLC_COLLATE=en_US.utf8 locale -k LC_COLLATEの出力
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
承認された回答:
C以外のものを使用している場合 ロケールでは、[a-z]のような範囲を使用しないでください これらはロケールに依存し、常に期待する結果が得られるとは限らないためです。すでに発生したケースの問題に加えて、一部のロケールでは発音区別符号を使用して文字を処理します(例:á )基本文字と同じ(つまり、 a 。
代わりに、名前付き文字クラスを使用してください:
echo B | grep '[[:lower:]]'
これにより、ロケールに対して常に正しい結果が得られます。ただし、入力テキストと適用しようとしているテストの両方の意味を反映するようにロケールを選択する必要があります。
関連:Php:imagechar —文字を水平方向に描画します
たとえば、特定のバイト値を見つける必要がある場合は、Cを使用します ロケール。常に利用可能です:
echo B | LANG=C grep '[a-z]'
これが期待どおりに機能しない場合は、実際にはバグです。