awk正規表現の一連の小文字に大文字が含まれるのはなぜですか?

awk正規表現の一連の小文字に大文字が含まれるのはなぜですか?
$ echo ABC | awk '$0 ~ /^[a-b]/'
ABC
$ echo ABC | awk '$0 ~ /^[a-a]/'
$ echo ABC | awk '$0 ~ /^a/'
$ 

望むより。/[a-b]/キャプチャしますAが、キャプチャしないことがあり/[a-a]/ます/a/。なぜ?

ベストアンサー1

私はこれが「ロケール」の問題だと思います。

私のロケールit_ITの次のコードスニペット

if [[ a < A ]]; then
  echo "a < A"
elif [[ a > A ]]; then
  echo "a > A"
else
  echo "a = A"
fi

if [[ b < A ]]; then
  echo "b < A"
elif [[ b > A ]]; then
  echo "b > A"
else
  echo "b = A"
fi

プログラム

a < A
b > A

Aだから(驚くべきことに)aとの間にあるので、b範囲内にあります。

実行しよう

echo ABC | LC_COLLATE=C awk '$0 ~ /^[a-b]/'

編集する

次のコマンドは、対応するロケールの組み合わせ順序を表示します。

echo $(LC_COLLATE=C printf '%s\n' {A..z} | sort)

マイコンピュータの出力は次のとおりです。

` ^ _ [ ] a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y z Z

(bashのマニュアルページでは理解できません配列表現ロケールの組み合わせ順に展開するかどうかはそうではありません。

おすすめ記事