O comportamento dos intervalos de caracteres depende da localidade, ou seja, das configurações de internacionalização. Locais diferentes têm ordem diferente para caracteres. Por exemplo, em uma localidade francesa (e na maioria das localidades onde há um caractere â
), â
será depois de a
e antes de b
.
A localidade C é aquela que não é específica de idioma (ou inglês dos EUA específico quando precisa fazer uma escolha), nesse local, caracteres são bytes e eles ordenam por seu valor de byte.
A área de locales em que tr
está preocupado é LC_CTYPE
para definir o tipo de caractere e LC_COLLATE
para definir a ordem dos caracteres. Note que hoje em dia os personagens têm um número variável de bytes, pois o utf-8 está se tornando cada vez mais comum como o conjunto de caracteres padrão.
Esses podem ser especificados usando variáveis de ambiente com o mesmo nome. No entanto, LC_ALL
substitui todos eles. Então, para ter certeza de obter o comportamento que você quer, você tem que desanexar LC_ALL e definir os que você gosta ou mais simples, basta definir LC_ALL:
LC_ALL=C tr -cd 'LC_ALL=C tr -d '0-7'
-7'
Ou:
LC_ALL=C tr -cd 'LC_ALL=C tr -d '0-7'
-7'
Isso também funciona para os dados utf-8 porque utf-8 é um superconjunto do ASCII e todos os caracteres não-ASCII possuem o oitavo bit definido em todos os seus bytes.