Je ne connais aucun paramètre régional qui, par défaut, trie dans cet ordre. La solution consiste à créer des paramètres régionaux personnalisés avec un ordre de tri personnalisé. Si quelqu'un, quatre ans plus tard, veut trier de manière personnalisée, voici l'astuce.
La grande majorité des paramètres régionaux ne spécifient pas leur propre ordre de tri, mais copient plutôt l'ordre de tri défini dans /usr/share/i18n/locales/iso14651_t1_common
c'est donc ce que vous voudrez modifier. Plutôt que de changer l'ordre de tri pour presque tous les paramètres régionaux en modifiant le iso14651_t1_common
d'origine , je vous suggère de faire une copie. Détails sur le fonctionnement de l'ordre de tri et sur la création de paramètres régionaux personnalisés dans votre $HOME
répertoire sans accès root se trouvent dans cette réponse à une question similaire.
Découvrez comment a
et A
sont classés en fonction de leurs entrées dans iso14651_t1_common
:
<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A
b
et B
sont similaires :
<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b
<U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B
On voit qu'au premier passage, les deux a
et A
avoir le symbole d'assemblage <a>
, tandis que les deux b
et B
avoir le symbole d'assemblage <b>
. Depuis <a>
apparaît avant <b>
en iso14651_t1_common
, a
et A
sont à égalité avant b
et B
. La deuxième passe ne rompt pas les liens car les quatre caractères ont le symbole d'assemblage <BAS>
, mais lors de la troisième passe, les liens sont résolus car le symbole d'assemblage pour les lettres minuscules <MIN>
apparaît à la ligne 3467, avant le symbole de classement pour les lettres majuscules <CAP>
(ligne 3488). Ainsi, l'ordre de tri se termine par a
, A
, b
, B
.
L'échange des premier et troisième symboles de classement trierait les lettres d'abord par casse (minuscule puis majuscule), puis par accent (<BAS>
signifie sans accent), puis par ordre alphabétique. Cependant , les deux <MIN>
et <CAP>
viennent avant les chiffres numériques, cela aurait donc pour effet indésirable de placer des chiffres après les lettres.
Le moyen le plus simple de garder les chiffres en premier tout en faisant tous les lettres minuscules viennent avant tous majuscules est de forcer toutes les lettres à s'attacher lors de la première comparaison en les mettant toutes égales à <a>
. Pour vous assurer qu'ils sont triés par ordre alphabétique dans la casse, remplacez le dernier symbole de classement par IGNORE
au premier symbole d'assemblage actuel. En suivant ce modèle, a
deviendrait :
<U0061> <a>;<BAS>;<MIN>;<a> # 198 a
A
deviendrait :
<U0041> <a>;<BAS>;<CAP>;<a> # 517 A
b
deviendrait :
<U0062> <a>;<BAS>;<MIN>;<b> # 233 b
B
deviendrait :
<U0042> <a>;<BAS>;<CAP>;<b> # 550 B
et ainsi de suite pour le reste des lettres.
Une fois que vous avez créé une version personnalisée de iso14651_t1_common
, suivez les instructions de la réponse ci-dessus pour compiler vos paramètres régionaux personnalisés.
Réglage LC_COLLATE=C
n'est pas toujours suffisant pour trier les majuscules avant les minuscules. Vous devrez peut-être définir LC_ALL=C
.
Cela prendra également en compte les caractères non alphanumériques et même non imprimables, mais si vous ne voulez pas qu'il y ait des options -d
et -i
(décrit dans man sort
) pour le désactiver.
Cependant, cela échouera probablement gravement avec une entrée multioctet, telle que UTF-8 avec des caractères non ASCII.
Pour obtenir des minuscules (dans l'ordre) avant des majuscules (dans l'ordre), la meilleure façon de penser à cela n'implique pas de sortir un langage de programmation à part entière est d'inverser la casse de toutes les lettres avant le tri, et de les inverser après.
tr 'a-zA-Z' 'A-Za-z' < file | LC_ALL=C sort | tr 'a-zA-Z' 'A-Za-z'
Je ne suis pas un expert mais je n'ai jamais vu de paramètres régionaux qui définissent le classement comme celui-ci. AFAIK ce classement est uniquement en C où il est basé sur des valeurs ASCII. (Normalement, je résoudrais simplement cela par un script.)
Cependant, je n'ai jamais fait cela, mais vous voudrez peut-être consulter les pages de manuel localedef(1) et locale(5) pour comprendre comment les paramètres régionaux sont définis et éventuellement définir le vôtre.
N'oubliez pas non plus que s'il y a des signes diacritiques ou des caractères spéciaux, la locale C ne les traitera pas comme vous le souhaiteriez. Par exemple, il ne mettra pas á
près de a
ou Ł
près de L
. Dans de tels cas, les paramètres régionaux natifs de la langue seraient probablement un meilleur point de départ.