¿Por qué sed no hace lo que se define en el archivo de clasificación regional para grep (y sed, awk)?

¿Por qué sed no hace lo que se define en el archivo de clasificación regional para grep (y sed, awk)?

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-zque 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 ay 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_COLLATEcategoría proporciona unasecuencia de intercalacióndefinición de numerosas utilidades en el volumen Shell y Utilidades de POSIX.1-2017 ( ls,, sortetc.), coincidencia de expresiones regulares (consulte Expresiones regulares) y las funciones,, y en strcoll()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_startpalabra 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 sortla 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 la LC_COLLATEcategorí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 clave order_starty order_endde la LC_COLLATEcategorí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 Aporque la entrada para A( <U0041>) no está entre las entradas para ay z.

Siguen siendo las entradas ay Aespecifican el mismo símbolo de clasificación <a>. De la misma manera by Bespecifica <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 especial IGNORE. 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 ay 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 Kpertenecer [a-z]cambiando el orden de clasificación.

Si desea grep '[a-z]' file | tr -d '\n'devolver una permutación de aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZen lugar de abcdefghijklmnopqrstuvwxyz, deberá utilizar una configuración regional con un orden de clasificación diferente. Puede ser una ubicación personalizada.

información relacionada