¿Cómo hacer que grep [A-Z] sea independiente de la configuración regional?
Estaba haciendo algunas tareas diarias y de repente descubrí que algo aparentemente trivial no funciona:
$ echo T | grep [A-Z]
Sin coincidencia
¿Cómo es que T no está dentro del rango A-Z?
Cambié un poco la expresión regular:
$ echo T | grep [A-Y]
¡Un partido
Whoa! ¿Cómo es T dentro de A-Y pero no dentro de A-Z?
Aparentemente esto se debe a que mi entorno está configurado en la configuración regional de Estonia, donde Y está al final del alfabeto pero Z está en algún lugar en el medio: ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY
$ echo $LANG
et_EE.UTF-8
Todo esto me sorprendió un poco. El 99% de las veces utilizo código de computadora, no literatura estonia. ¿He estado usando grep de forma incorrecta todo el tiempo? ¿Qué tipo de errores he cometido debido a esto en el pasado?
Después de probar varias cosas, llegué a la siguiente solución:
$ echo T | LANG=C grep [A-Z]
Es esta la forma recomendada de hacer grep independiente de la configuración regional?
Más adelante ... ¿sería seguro definir un alias como ese:
$ alias grep="LANG=C grep"
PD También me pregunto por qué los rangos de caracteres son como[A-Z]
locale dependiente en primer lugar mientras que\w
arece que @ no se ve afectado por la configuración regional (aunque el manual dice\w
es equivalente a[[:alnum:]]
- pero descubrí que esto último depende de la configuración regional mientras que\w
no)