[A-Z]in bashcorrespond à tous les éléments de classement (les caractères mais appellent également une séquence de caractères comme Dszdans les paramètres régionaux hongrois) qui trient après Aet trient avant Z. Dans votre région, les ctris probablement entre B et C.
$ printf '%s\n' A a á b B c C Ç z Z Ẑ | sort
a
A
á
b
B
c
C
Ç
z
Z
Ẑ
Donc cou zserait assorti par [A-Z], mais pas Ẑou a.
$ printf '%s\n' A a á b B c C Ç z Z Ẑ |
pipe> bash -c 'while IFS= read -r x; do case $x in [A-Z]) echo "$x"; esac; done'
A
á
b
B
c
C
Ç
z
Z
Dans les paramètres régionaux C, l'ordre serait:
$ printf '%s\n' A a á b B c C Ç z Z Ẑ | LC_COLLATE=C sort
A
B
C
Z
a
b
c
z
Ç
á
Ẑ
Alors [A-Z]correspondrait A, B, C, Z, mais pas Çet toujours pas Ẑ.
Si vous voulez faire correspondre les lettres majuscules (dans n'importe quel script), vous pouvez utiliser à la [[:upper:]]place. Il n'y a pas de moyen intégré de bashfaire correspondre uniquement les lettres majuscules dans le script latin (sauf en les listant individuellement).
Si vous voulez faire correspondre l' Aà Z anglais lettres sans signes diacritiques, vous pouvez utiliser [A-Z]ou [[:upper:]]mais dans le Clieu ( en supposant que les données ne sont pas codées dans les jeux de caractères comme GRAND5 ou GB18030 qui a plusieurs caractères dont le codage contient l'encodage de ces lettres) ou de la liste individuellement ( [ABCDEFGHIJKLMNOPQRSTUVWXYZ]).
Notez qu'il existe certaines variations entre les coquilles.
For zsh, bash -O globasciiranges(option étrangement nommée introduite dans bash-4.3), schily-shet yash, les [A-Z]correspondances sur les caractères dont le point de code est compris entre celui de Aet celui de Z, seraient donc équivalentes au comportement de bashla locale C.
Pour les cendres, les mksh et les coquilles anciennes, comme zshci-dessus, mais limité aux jeux de caractères codés sur un octet. C’est-à-dire que, dans un environnement local UTF-8 par exemple, [É-Ź]ne correspondrait pas à Ó, mais puisque cela [<c3><89>-<c5><b9>]correspond aux valeurs d’octets 0x89 à 0xc5!
ksh93se comporte comme bashsi ce n’était les cas spéciaux dont les extrémités commençaient par des lettres minuscules ou des lettres majuscules. Dans ce cas, seuls les éléments de classement triés entre ces extrémités sont appariés, mais qui sont (ou leur premier caractère pour les éléments de classement multi-caractères) également en minuscule (ou majuscule, respectivement). Donc, [A-Z]il y aurait correspondance É, mais pas ecomme etrie entre Aet Zmais n'est pas comme majuscule Aet Z.
Pour les fnmatch()modèles (comme dans find -name '[A-Z]') ou les expressions régulières système (comme dans grep '[A-Z]'), cela dépend du système et des paramètres régionaux. Par exemple, sur un système GNU ici, [A-Z]ne correspond pas xà l' en_GB.UTF-8environnement local, mais au contraire th_TH.UTF-8. Les informations utilisées pour déterminer cela ne sont pas claires, mais elles sont apparemment basées sur une table de consultation dérivée des données de paramètres régionaux LC_COLLATE ).
POSIX autorise tous les comportements, car POSIX laisse le comportement des plages non spécifiées dans des paramètres régionaux autres que les paramètres régionaux C. Nous pouvons maintenant discuter des avantages de chaque approche.
bashCette approche a beaucoup de sens car [C-G]nous voulons que les personnages se situent entre Cet G. Et l'utilisation de l'ordre de tri de l'utilisateur pour déterminer ce qui est intermédiaire est l'approche la plus logique.
Le problème, c’est que cela répond aux attentes de beaucoup de gens, en particulier de ceux qui sont habitués au comportement traditionnel du pré-Unicode, même des jours qui précédaient l’internationalisation. Bien que d'un utilisateur normal, il est logique mai qui [C-I]comprend hque la hlettre est entre Cet Iet [A-g]ne comprend pas Z, il est une autre affaire pour les personnes ayant traité avec ASCII seulement pendant des décennies.
Ce bashcomportement est également différent de la [A-Z]correspondance de plage dans d'autres outils GNU, comme dans les expressions régulières GNU (comme dans grep/ sed...) ou fnmatch()comme dans find -name.
Cela signifie également que ce qui [A-Z]correspond à l'environnement, au système d'exploitation et à la version du système d'exploitation. Le fait de [A-Z]correspondre à Á mais pas à Ź est également sous-optimal.
Pour zsh/ yash, nous utilisons un ordre de tri différent. Au lieu de s’appuyer sur la notion d’ordre des caractères de l’utilisateur, nous utilisons les valeurs de code des points de caractère. Cela a l'avantage d'être facile à comprendre, mais d'un point de vue pratique, en dehors de l'ASCII, ce n'est pas très utile. [A-Z]correspond aux 26 lettres majuscules anglais anglais, [0-9]correspond aux chiffres décimaux. Il existe des points de code dans Unicode qui suivent l'ordre de certains alphabets mais ce n'est pas généralisé et ne peut pas être généralisé car de toute façon, différentes personnes utilisant un même script ne sont pas nécessairement d'accord sur l'ordre des lettres.
Pour les shells traditionnels et mksh, dash, c'est brisé (maintenant que la plupart des gens utilisent des caractères multi-octets), mais principalement parce qu'ils ne disposent pas encore d'une prise en charge multi-octets. Ajout d'un support multi-octets à coquilles comme bashet zsha été un énorme effort et est toujours en cours. yash(un shell japonais) a été initialement conçu avec une prise en charge multi-octets.
L'approche de ksh93 présente l'avantage d'être compatible avec les expressions régulières du système ou avec fnmatch () (ou du moins, du moins sur les systèmes GNU). Là, cela ne brise pas l'attente de certaines personnes, car il [A-Z]n'inclut pas les lettres minuscules, [A-Z]inclut É(et Á, mais pas). Ce n'est pas compatible avec sortou généralement l' strcoll()ordre.
localesortie? Je ne peux pas reproduire ceci (touch foo; echo [A-Z]*sort le motif littéral, pas "foo", dans un répertoire autrement vide).