Tener un archivo con todos los caracteres ascii (imprimibles):
$ printf '%b' "$(printf '\\U%x\n' {32..126})" > file
Eso podría ordenarse (usando tr para reducir la salida larga a una línea):
$ sort file | tr -d '\n'
!"#%&'()*+,-./:;<=>?@[\]^_`{|}~$0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
Muestra que en una computadora Debian que utiliza una configuración regional en_US.utf8, la clasificación (para caracteres individuales) tiene primero todos los signos de puntuación, luego los números y luego las letras mayúsculas y minúsculas entremezcladas. Es decir: aAbB, letras minúsculas y mayúsculas juntas.
Supongamos que eso es correcto y que es lo que el usuario (Yo) quiere que suceda al cotejar.
Sin embargo, en el mismo sistema, sin ningún otro cambio, sucede esto:
$ grep '[a-z]' file | tr -d '\n'
abcdefghijklmnopqrstuvwxyz
Ese es el rango a-z
que se traduce por algo solo a letras ASCII minúsculas.
¿Quién hace la traducción y cómo se podría controlar o cambiar?
No estoy preguntando qué son las letras minúsculas ni qué debería significar [az] o si alguien quiere que eso signifique.
Supongo que [a-z]
es un rango que comienza a
y termina enz
en el orden de clasificación.
Entiendo que algunos otros usuarios quieren que el [a-z]
significado sea el mismo que "minúsculas" en cualquier idioma. Y podría "vivir con eso" de forma predeterminada.
Pero, ¿cómo podría controlar y/o cambiar eso, si fuera necesario? ¿Dónde está la perilla para cambiar eso?
No, cambiar los archivos de clasificación no ayuda, hay algo que va más allá de eso y refuerza la opinión personal de que [a-z]
debe significar ASCII en minúsculas todo el tiempo en todas las configuraciones regionales.
Respuesta1
leí lo queestados POSIX. Mi interpretación es que hay dos conceptos no equivalentes:
- secuencia de clasificación (secuencia de clasificación)
- orden de intercalación
Fragmentos relevantes [el énfasis es mío]:
La
LC_COLLATE
categoría proporciona unasecuencia de intercalacióndefinición de numerosas utilidades en el volumen Shell y Utilidades de POSIX.1-2017 (ls
,,sort
etc.), coincidencia de expresiones regulares (consulte Expresiones regulares) y las funciones,, y enstrcoll()
el volumen Interfaces del sistema de POSIX.1- 2017.strxfrm()
wcscoll()
wcsxfrm()
Asecuencia de intercalaciónLa definición definirá el orden relativo entre los elementos de clasificación (caracteres y elementos de clasificación de varios caracteres) en la configuración regional. Este orden se expresa en términos de valores de intercalación; es decir, asignando a cada elemento uno o más valores de clasificación (también conocidos como pesos de clasificación). […]
La
order_start
palabra clave deberá precederorden de intercalaciónentradas y también definir el número de pesos para estesecuencia de intercalacióndefinición y otras reglas de intercalación.
Elorden de intercalacióncomo se define en esta sección afecta la interpretación de las expresiones entre corchetes en expresiones regulares (consulte RE Expresión entre corchetes).
Porque sort
la secuencia de clasificación es importante, es decir, los pesos. Para grep '[a-z]'
el orden de clasificación es importante, es decir, el orden de las entradas del orden de clasificación.
Lamentablemente, sólo se muestra la secuencia de clasificación.definido explícitamente, por lo que no hay una indicación clara de que el orden de clasificación sea un concepto diferente.
Secuencia de clasificación
El orden relativo de clasificación de elementos según lo determinado por la configuración de laLC_COLLATE
categoría en la ubicación actual. El orden de clasificación se utiliza para la clasificación y se determina a partir de los pesos de clasificación asignados a cada elemento de clasificación. En ausencia de ponderaciones, la secuencia de clasificación es el orden en el que se especifican los elementos de clasificación entre las palabras claveorder_start
yorder_end
de laLC_COLLATE
categoría.
En mi Debian 9, cuando se trata de LC_COLLATE
, muchas configuraciones regionales eventualmente hacen referencia a iso14651_t1_common
(es decir, /usr/share/i18n/locales/iso14651_t1_common
). El fragmento relevante del archivo se ve así:
<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a <U00AA> <a>;<PCL>;<EMI>;IGNORE # 199 ª <U00E1> <a>;<ACA>;<MIN>;IGNORE # 200 á […] <U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b <U0253> <b>;<CRL>;<MIN>;IGNORE # 234 ɓ <U1E03> <b>;<PCT>;<MIN>;IGNORE # 235 ḃ […] <U007A> <z>;<BAS>;<MIN>;IGNORE # 507 z <U017A> <z>;<ACA>;<MIN>;IGNORE # 508 <z'> <U017E> <z>;<CAR>;<MIN>;IGNORE # 509 <z<> […] <U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A <U00C1> <a>;<ACA>;<CAP>;IGNORE # 518 Á <U00C0> <a>;<GRA>;<CAP>;IGNORE # 519 À […] <U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B <U1E02> <b>;<PCT>;<CAP>;IGNORE # 551 <B.> <U1E04> <b>;<BPT>;<CAP>;IGNORE # 552 Ḅ […] <U005A> <z>;<BAS>;<CAP>;IGNORE # 813 Z <U0179> <z>;<ACA>;<CAP>;IGNORE # 814 <Z'> <U017D> <z>;<CAR>;<CAP>;IGNORE # 815 <Z<>
Este es elorden de intercalación. [a-z]
no contiene A
porque la entrada para A
( <U0041>
) no está entre las entradas para a
y z
.
Siguen siendo las entradas a
y A
especifican el mismo símbolo de clasificación <a>
. De la misma manera b
y B
especifica <b>
. Esto se traduce en pesos:
Los pesos se expresarán como caracteres (en cualquiera de las formas especificadas en Definición de configuración regional),
<collating-symbol>
s,<collating-element>
s, puntos suspensivos o el símbolo especialIGNORE
. Un solo carácter, a<collating-symbol>
o a<collating-element>
representará la posición relativa en el carácter.secuencia de clasificacióndel personaje o símbolo, más que del personaje o personajes mismos. Por lo tanto, en lugar de asignar valores absolutos a los pesos, un peso particular se expresa utilizando el valor de orden relativo asignado a un elemento de clasificación en función de su orden en el carácter.secuencia de intercalación.
En el archivo <a>
y <b>
se definen en este orden:
collating-symbol <a> collating-symbol <b>
Esto hace que la subsecuencia relevante desecuencia de intercalaciónser aAbB
. Esto es lo que le importa sort
.
Para confirmar esto, moví (temporalmente) la siguiente entrada de orden de clasificación
<U004B> <k>;<BAS>;<CAP>;IGNORE # 649 K
a una posición justo antes de la entrada de v
, es decir, en algún lugar entre a
y z
. Reconstruí mis locales con locale-gen
. Ahora sort file | tr -d '\n'
todavía regresa …iIjJkKlLmM…
(los pesos no cambiaron, la secuencia de clasificación no cambió), pero grep '[a-z]' file | tr -d '\n'
produce:
Kabcdefghijklmnopqrstuvwxyz
Significa que hice K
pertenecer [a-z]
cambiando el orden de clasificación.
Si desea grep '[a-z]' file | tr -d '\n'
devolver una permutación de aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
en lugar de abcdefghijklmnopqrstuvwxyz
, deberá utilizar una configuración regional con un orden de clasificación diferente. Puede ser una ubicación personalizada.