[A-Z]
in bash
correspond à tous les éléments de classement (les caractères mais appellent également une séquence de caractères comme Dsz
dans les paramètres régionaux hongrois) qui trient après A
et trient avant Z
. Dans votre région, les c
tris 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 c
ou z
serait 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 bash
faire 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 C
lieu ( 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-sh
et yash
, les [A-Z]
correspondances sur les caractères dont le point de code est compris entre celui de A
et celui de Z
, seraient donc équivalentes au comportement de bash
la locale C.
Pour les cendres, les mksh et les coquilles anciennes, comme zsh
ci-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!
ksh93
se comporte comme bash
si 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 e
comme e
trie entre A
et Z
mais n'est pas comme majuscule A
et 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-8
environnement 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.
bash
Cette approche a beaucoup de sens car [C-G]
nous voulons que les personnages se situent entre C
et 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 h
que la h
lettre est entre C
et I
et [A-g]
ne comprend pas Z
, il est une autre affaire pour les personnes ayant traité avec ASCII seulement pendant des décennies.
Ce bash
comportement 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 bash
et zsh
a é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 sort
ou généralement l' strcoll()
ordre.
locale
sortie? Je ne peux pas reproduire ceci (touch foo; echo [A-Z]*
sort le motif littéral, pas "foo", dans un répertoire autrement vide).