[A-Z]en bashcoincide con todos los elementos de clasificación (los caracteres, pero la llamada también es una secuencia de caracteres como Dszen las configuraciones regionales húngaras) que se ordenan después Ay antes Z. En su localidad, cprobablemente 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, co zserí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 bashhacer coincidir solo las letras mayúsculas en el alfabeto latino (excepto al enumerarlas individualmente).
Si desea que coincida con el Ade Z Inglés letras sin signos diacríticos, puede utilizar cualquiera [A-Z]o [[:upper:]]sino en la Cconfiguració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-shy yash, [A-Z]coincide con los caracteres cuyo punto de código está entre el de Ay el de Z, por lo que sería equivalente al comportamiento de bashen la configuración regional de C.
Para cenizas, mksh y conchas antiguas, igual que el zshanterior 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!
ksh93se comporta como, bashexcepto 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 elo eque se clasifica entre Ay Zpero no es mayúscula como Ay 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 xen la en_GB.UTF-8configuració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.
bashEl enfoque tiene mucho sentido ya que con [C-G], queremos los caracteres entre Cy 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 hcomo la hcarta es entre Cy Iy que [A-g]no incluye Z, es un asunto diferente para las personas de haber tratado con ASCII solamente durante décadas.
Ese bashcomportamiento 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 bashy zshha 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 sortgeneral strcoll().
localesalida? No puedo reproducir esto (touch foo; echo [A-Z]*genera el patrón literal, no "foo", en un directorio vacío).