ワイルドカード/ワイルドカード:文字範囲に問題がありますか?

ワイルドカード/ワイルドカード:文字範囲に問題がありますか?

存在するLinuxのコマンドラインWilliam Shotsは、文字の範囲に問題がある可能性があると主張しています。以下の関連抜粋を参照してください。ポイントは私です。

文字範囲

他のUnixファミリー環境から来た場合、またはそのトピックに関する別の本を読んだ場合は、[A-Z]文字[a-z]範囲記号に遭遇した可能性があります。これは従来のUnix表記であり、以前のバージョンのLinuxでも機能します。それでも動作しますが、正しく設定しないと予想される結果は生成されないため、慎重に使用する必要があります。今はこれを避け、文字クラスを使用する必要があります。

彼の最後の言葉は何でしたか? POSIX規格はこれについて何を言いますか?

答え1

これは、大文字と小文字を最初に使用してから別の文字を使用するのではなく、交互に使用するロケールを意味する可能性が高いです。

$ echo "$LANG"
en_US.UTF-8
$ touch a A z Z
$ ls
A  Z  a  z
$ bash -c 'echo [a-z]'
a A z

ただし、適切な文字クラスが機能する可能性があります。

$ bash -c 'echo [[:lower:]]'
a z

aしかし、以下よりも多くを一致させることも可能ですz

$ LANG=fi_FI.UTF-8
$ touch ä Ä ö Ö
$ bash -c 'echo [[:lower:]]'
a z ä ö

これを防ぎ、英語の小文字のみをa一致させたい場合は、zBashには範囲をASCII順に解釈するオプションがあります。

$ bash -c 'shopt -s globasciiranges; echo [a-z]'
a z

いつでも基本的な照合順序を強制できます。

$ LC_COLLATE=C bash -c 'echo [a-z]'
a z

POSIXが言うように、角括弧式の範囲は、デフォルトのPOSIXロケールではなくロケールで定義されていないようです。パターンマッチングの説明は以下を参照してください。角かっこ式の正規表現の説明、内容は次のとおりです。

POSIXロケールでは、範囲式は、組み合わせシーケンスの2つの要素を含む2つの要素間の組み合わせ要素のセットを表します。他のロケールでは、範囲式に指定されていない動作があります。つまり、厳密に互換性のあるアプリケーションは、範囲式が有効かどうか、または一致する組み合わせ要素のセットに依存してはなりません。

関連情報