[A-Z]
en bash
coincide con todos los elementos de clasificación (los caracteres, pero la llamada también es una secuencia de caracteres como Dsz
en las configuraciones regionales húngaras) que se ordenan después A
y antes Z
. En su localidad, c
probablemente clasifique entre B y C.
$ printf '%s\n' A a á b B c C Ç z Z Ẑ | sort
a
A
á
b
B
c
C
Ç
z
Z
Ẑ
Entonces, c
o z
sería igualado por [A-Z]
, pero no Ẑ
o 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
En la configuración regional C, el orden sería:
$ printf '%s\n' A a á b B c C Ç z Z Ẑ | LC_COLLATE=C sort
A
B
C
Z
a
b
c
z
Ç
á
Ẑ
Así [A-Z]
se correspondería A
, B
, C
, Z
, pero no Ç
y aún así no Ẑ
.
Si desea hacer coincidir las letras mayúsculas (en cualquier secuencia de comandos), puede usar [[:upper:]]
en su lugar. No hay una manera integrada de bash
hacer coincidir solo las letras mayúsculas en el alfabeto latino (excepto al enumerarlas individualmente).
Si desea que coincida con el A
de Z
Inglés letras sin signos diacríticos, puede utilizar cualquiera [A-Z]
o [[:upper:]]
sino en la C
configuración regional (suponiendo que los datos no están codificados en los juegos de caracteres como Big5 o GB18030 que tiene varios personajes cuya codificación contiene la codificación de esas cartas) o lista ellos individualmente ( [ABCDEFGHIJKLMNOPQRSTUVWXYZ]
).
Tenga en cuenta que hay alguna variación entre los depósitos.
For zsh
, bash -O globasciiranges
(opción extrañamente nombrada introducida en bash-4.3), schily-sh
y yash
, [A-Z]
coincide con los caracteres cuyo punto de código está entre el de A
y el de Z
, por lo que sería equivalente al comportamiento de bash
en la configuración regional de C.
Para cenizas, mksh y conchas antiguas, igual que el zsh
anterior pero limitado a conjuntos de caracteres de un solo byte. Es decir, en un entorno local UTF-8, por ejemplo, [É-Ź]
no coincidiría Ó
, pero como eso [<c3><89>-<c5><b9>]
, ¡coincidiría con los valores de bytes 0x89 a 0xc5!
ksh93
se comporta como, bash
excepto que trata como rangos de casos especiales cuyos extremos comienzan con letras minúsculas o mayúsculas. En ese caso, solo coincide en elementos de clasificación que se clasifican entre esos extremos, pero que son (o su primer carácter para elementos de clasificación de varios caracteres) también minúsculas (o mayúsculas respectivamente). Por [A-Z]
lo tanto , coincidiría con É
, pero no con e
lo e
que se clasifica entre A
y Z
pero no es mayúscula como A
y Z
.
Para fnmatch()
patrones (como en find -name '[A-Z]'
) o expresiones regulares del sistema (como en grep '[A-Z]'
), depende del sistema y la configuración regional. Por ejemplo, en un sistema GNU aquí, [A-Z]
no coincide x
en la en_GB.UTF-8
configuración regional, pero sí en la th_TH.UTF-8
. No me queda claro qué información utiliza para determinar eso, pero aparentemente se basa en una tabla de búsqueda derivada de los datos de la configuración regional LC_COLLATE ).
POSIX permite todos los comportamientos, ya que POSIX deja el comportamiento de los rangos sin especificar en configuraciones regionales distintas de la configuración regional C. Ahora podemos discutir sobre los beneficios de cada enfoque.
bash
El enfoque tiene mucho sentido ya que con [C-G]
, queremos los caracteres entre C
y G
. Y usar el orden de clasificación del usuario para determinar qué es lo intermedio es el enfoque más lógico.
Ahora, el problema es que rompe las expectativas de muchas personas, especialmente aquellas personas acostumbradas al comportamiento tradicional de pre-Unicode, incluso los días previos a la internacionalización. Si bien desde un usuario normal, que tiene sentido de mayo que [C-I]
incluye h
como la h
carta es entre C
y I
y que [A-g]
no incluye Z
, es un asunto diferente para las personas de haber tratado con ASCII solamente durante décadas.
Ese bash
comportamiento también es diferente de la [A-Z]
coincidencia de rango en otras herramientas de GNU como en las expresiones regulares de GNU (como en grep
/ sed
...) o fnmatch()
como en find -name
.
También significa que lo que [A-Z]
coincide varía con el entorno, con el sistema operativo y con la versión del sistema operativo. El hecho de que [A-Z]
coincida con Á pero no con Ź también es subóptimo.
Para zsh
/ yash
, utilizamos un orden de clasificación diferente. En lugar de confiar en la noción de orden de caracteres del usuario, utilizamos los valores del código de punto de carácter. Tiene el beneficio de ser fácil de entender, pero desde un punto práctico de pocos, fuera de ASCII, no es muy útil. [A-Z]
coincide con las 26 letras mayúsculas del inglés de EE. UU., [0-9]
coincide con los dígitos decimales. Hay puntos de código en Unicode que siguen el orden de algunos alfabetos, pero eso no está generalizado y no puede generalizarse, ya que de todos modos las diferentes personas que usan un mismo script no necesariamente están de acuerdo con el orden de las letras.
Para los shells y mksh tradicionales, el guión está roto (ahora que la mayoría de las personas usa caracteres de varios bytes), pero principalmente porque todavía no tienen soporte para varios bytes. Agregar soporte de varios bytes a shells como bash
y zsh
ha sido un gran esfuerzo y aún está en curso. yash
(un shell japonés) se diseñó inicialmente con soporte de múltiples bytes desde el principio.
El enfoque de ksh93 tiene el beneficio de ser coherente con las expresiones regulares del sistema o fnmatch () (o al menos parece al menos en los sistemas GNU). Allí, no rompe las expectativas de algunas personas, ya [A-Z]
que no incluye letras minúsculas, [A-Z]
incluye É
(y Á, pero no Ź). No es consistente con el orden en sort
general strcoll()
.
locale
salida? No puedo reproducir esto (touch foo; echo [A-Z]*
genera el patrón literal, no "foo", en un directorio vacío).