Como tornar o grep [A-Z] independente da localidade?
Eu estava fazendo alguns grepping todos os dias e de repente descobri que algo aparentemente trivial não funciona:
$ echo T | grep [A-Z]
Nenhuma correspondência.
Por que T não está dentro da faixa A-Z?
Alterei um pouco a regex:
$ echo T | grep [A-Y]
Uma partida
Uau! Como está T dentro de A-Y, mas não dentro de A-Z?
Aparentemente, isso ocorre porque meu ambiente está definido como localidade estoniana, onde Y está no final do alfabeto, mas Z está em algum lugar no meio: ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY
$ echo $LANG
et_EE.UTF-8
Isso tudo foi um choque para mim. 99% das vezes eu escrevo código de computador, não literatura da Estônia. Eu tenho usado grep da maneira errada o tempo todo? Que tipo de erros eu cometi por causa disso no passado?
Depois de tentar várias coisas, cheguei à seguinte solução:
$ echo T | LANG=C grep [A-Z]
Essa é a maneira recomendada de tornar o grep independente do loca
Mais ainda ... seria seguro definir um apelido como esse:
$ alias grep="LANG=C grep"
PS. Também estou me perguntando por que os intervalos de caracteres são como[A-Z]
locale dependente em primeiro lugar enquanto\w
parece não ser afetado pela localidade (embora o manual diga\w
é equivalente a[[:alnum:]]
- mas descobri que o último depende da localidade enquanto\w
não)