2011-01-29 34 views
12

He notado por un tiempo que, en algunos de los sistemas basados ​​en Unix que uso al menos, ls [A-Z]* me ha estado dando los resultados que esperaba de ls [A-Za-z]*, dejándome incapaz de obtener fácilmente una lista de los malditos archivos que comienzan con letras mayúsculas. Acabo de encontrar lo mismo con grep, donde no pude conseguir que dejara de coincidir letras minúsculas con [A-Z] hasta que finalmente usé grep -P para obtener Perl regex.¿Qué pasa con [A-Z] que significa [A-Za-z]?

así que tengo algunas preguntas relacionadas:

  1. cuándo comenzó esta idiotez?
  2. ¿Quién es responsable y debe ser castigado?
  3. ¿POR QUÉ ???
  4. ¿Hay alguna solución razonablemente simple para uno o ambos de los casos ls y grep? (Tratando, por ejemplo, grep --no-ignore-case fue infructuosa. grep -P no es una muy buena solución, debido a su estado de la función experimental.)
+1

'[[: upper:]]' es otra opción. – wnoise

+0

Ah, gracias. Tengo algún tipo de alergia a esas construcciones y nunca pienso en ellas. – chaos

+0

Tropecé con esto mientras buscaba algo diferente, y la votación ascendente porque sus preguntas relacionadas me hicieron estallar. :-) – KSwift87

Respuesta

15

En realidad es [A-Za-y], y tiene que ver con el cotejo idioma. Si desea anularlo, configure $LC_COLLATE de manera apropiada; cualquiera de C o POSIX debería hacer.

+0

Oh, gracias, gracias. '[A-Za-y]'? Estoy aterrado de preguntar, pero ¿por qué 'y' y no' z'? – chaos

+0

Porque 'Z' está antes de' z' en el orden de clasificación. –

+3

Derecha, en estos entornos rotos '[A-Z]' se convierte en '[AaBbCcDd .... YyZ]' – wnoise

3

Depende de su configuración regional. Si desea que [A..Z] solo coincida con letras mayúsculas, puede usar la configuración regional C: establecer LC_COLLATE o LC_ALL en C.

LC_ALL=C 
ls [A..Z]* 

bash manual, pattern matching

+1

Pero entonces, la desventaja IMO de esto es que cuando 'ls', obtienes primero todos los archivos en mayúsculas y luego todas las minúsculas ... y como resultado, la mayoría del tiempo, tienes que buscar en dos lugares para un archivo que no puede recordar si comienza con mayúsculas o minúsculas.;-) –

-1

cáscaras de Unix no utilizan expresiones regulares, pero patrones globales, que son claramente diferentes de expresiones regulares. Una diferencia es que están anclados implícitamente al inicio y al final de la cadena, p. ls foo[a-z] mostrará el archivo food, pero no fooble. En realidad, no es ls haciendo la coincidencia aquí, sino el propio shell. Globs también son generalmente a veces insensible a mayúsculas (según la implementación).

Eche un vistazo a la página de manual de su caparazón interactivo favorito y lea acerca de la coincidencia global: por ejemplo, bash's manpage about filename expansion describe la sintaxis que utiliza.

+1

Tiene razón en que el shell usa globs en lugar de expresiones regulares, pero los globs distinguen entre mayúsculas y minúsculas. – wnoise

+0

@wnoise: hmm, creo que esa parte depende de la implementación; Haré más investigación. – Ether