Pourquoi les majuscules sont-elles incluses dans une gamme de lettres minuscules dans une regex awk?

$ echo ABC | awk '$0 ~ /^[ab]/' ABC $ echo ABC | awk '$0 ~ /^[aa]/' $ echo ABC | awk '$0 ~ /^a/' $ 

Tu vois. /[ab]/ capture A , mais /[aa]/ ou /a/ ne le fait pas. Pourquoi?

C'est un problème de "localization", je pense.

Dans ma locale, it_IT, l'extrait suivant

 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 

montre

 a < A b > A 

de sorte que A est (étonnamment) entre a et b , donc dans la gamme.

Essayez d'exécuter

 echo ABC | LC_COLLATE=C awk '$0 ~ /^[ab]/' 

modifier

la command suivante affiche l'ordre de classment dans votre environnement local:

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

la sortie sur ma machine est

  ` ^ _ [ ] 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 

(ne peut pas comprendre à partir de la page de manuel de bash si les expressions de séquence sont développées dans l'ordre de classment des parameters régionaux ou non, cela ne semble pas).