Esta es una pregunta de tarea:
Haga coincidir todos los nombres de archivo con 2 o más caracteres que comiencen con una letra minúscula, pero no terminen con una letra mayúscula.
No entiendo por qué mi solución no funciona.
Entonces ejecuté lo siguiente:
touch aa
touch ha
touch ah
touch hh
touch a123e
touch hX
touch Ax
ls [a-z]*[!A-Z]
Salida:
aa ha
Mi pregunta: ¿Por qué no coincide con "ah", "hh" o "a123e"?
mksh
shell, pero nobash --posix
, así que debe haber alguna regla específica para bash`mksh
al igual quezsh
's[A-Z]
no coincide con elÉ
, por ejemplo. Los[A-Z]
partidos de ksh93 están encendidosÉ
pero no encendidosh
.Respuestas:
Este es un problema local . En su configuración regional, se
[A-Z]
expande a algo como[AbBcZ...zZ]
(más probablemente otros como caracteres acentuados), por[^A-Z]
lo tanto, en realidad significa "archivos que terminan cona
" en su ejemplo (y solo en su ejemplo).Si desea evitar tal sorpresa, una forma es establecerla,
LC_COLLATE=C
ya que la clasificación es la parte de la configuración regional que es responsable del orden de clasificación. Además, vacíeLC_ALL
si está configurado, ya que tendría prioridad.O, mejor, probablemente sea preferible no cambiar la configuración regional y usar las clases apropiadas: en
[:lower:]
lugar de[a-z]
y en[:upper:]
lugar de[A-Z]
.O use la
globasciiranges
opción de bash :fuente
LC_ALL=C ls [a-z]*[^A-Z]
solo afectaríals
la configuración regional, no la configuración regional utilizada por el shell para expandir el globo o analizar esa línea de comando.LC_xxx
para que se aplique al glob, pero sería preferible para que ls obtenga la misma configuración regional.test-鏏
por ejemplo, porque una vez que cambia el juego de caracteres al de la configuración regional C, se鏏
convierte en<0xe7>A
. IOW, al cambiar LC_CTYPE, obtienes diferentes caracteres.é
,Á
(pero probablemente noŹ
). IOW, usar[A-Z]
tiene poco sentido fuera de la configuración regional C.