2011-07-23 6 views
7

que estaba haciendo alguna grepping todos los días y de repente descubrió que algo aparentemente trivial no funciona:¿Cómo hacer que grep [A-Z] sea independiente de la configuración regional?

$ echo T | grep [A-Z] 

No hay resultados.

¿Cómo es que T no está dentro del rango A-Z?

me cambió la expresión regular un poquito:

$ echo T | grep [A-Y] 

Un partido!

Whoa! ¿Cómo está T dentro de A-Y pero no dentro de A-Z?

Al parecer, esto se debe a mi entorno se establece en la configuración regional de Estonia, donde Y es al final del alfabeto, pero Z es en algún punto intermedio: ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY

$ echo $LANG 
et_EE.UTF-8 

Todo esto fue un poco de un choque de yo. El 99% del tiempo grep el código de la computadora, no la literatura estonia. ¿He estado usando grep de la manera incorrecta todo el tiempo? ¿Qué tipo de errores he cometido por esto en el pasado?

Después de probar varias cosas que llegamos a la siguiente solución:

$ echo T | LANG=C grep [A-Z] 

¿Es esta la forma recomendada para hacer grep independiente de la Localidad?

Más más ... ¿sería seguro para definir un alias de esa manera:

$ alias grep="LANG=C grep" 

PS. También me pregunto por qué los rangos de caracteres como [A-Z] dependen de la configuración regional en primer lugar, mientras que \w parece no ser afectado por la configuración regional (aunque el manual dice \w es equivalente a [[:alnum:]] - pero descubrí que este último depende de la configuración regional mientras \w no).

+0

Por favor intente todo de nuevo, pero cite su expresión 'grep '[A-Z]'', solo para asegurarse de que el shell no lo está expandiendo. – Mat

+0

Funciona exactamente igual para mí con y sin comillas. –

+0

Funciona de la misma manera porque no tiene un archivo llamado A hasta Z. El shell intentó expandir [A-Z], no encontró nada y lo dejó solo. Use comillas para pasar siempre los patrones a grep. – Gilbert

Respuesta

5

Las expresiones regulares POSIX, que Linux y FreeBSD grep admiten naturalmente, y algunas otras admiten bajo petición, tienen una serie de patrones [: xxx:] que respetan las configuraciones regionales. Vea la página de manual para más detalles.

 grep '[[:upper:]]'

Como los s [] son ​​parte del nombre del patrón que necesita el exterior [], así, a pesar de lo extraño que parece.

Con la llegada de estos: los códigos del clásico \ w, etc., permanecen estrictamente en la configuración regional C. Por lo tanto, su elección de patrones determina si grep usa la configuración regional actual o no.

[A-Z] debe seguir la configuración regional, pero es posible que deba establecer LC_ALL en lugar de LANG, especialmente si el sistema establece LC_ALL en un valor diferente para usted.

+0

Entonces, ¿dice que [A-Z] permanece estrictamente en la configuración C? Pero toda mi pregunta era que no estaba en C locale. –

+0

Intente configurar la variable de entorno LC_ALL en lugar de LANG. – Gilbert

+0

LC_ALL es probablemente una variable mejor para usar que LANG ya que es la que grep busca primero. Pero actualmente no hace ninguna diferencia para mí. –

Cuestiones relacionadas