tr comando não funciona com sequências octal

1

Eu preciso remover caracteres não ASCII de um arquivo. Eu estava usando o comando -

/usr/xpg4/bin/tr -cd '%code%-7' <non-ASCII_file.dat > ASCII_file.dat

Embora tenha funcionado no passado, não está funcionando agora. Agora está retirando todo o alfabeto junto com caracteres não-ASCII. Os únicos caracteres que estão sendo deixados no arquivo ASCII são números e caracteres especiais no conjunto ASCII.

o SO é o Solaris 9.

O que pode estar causando esse problema? O intervalo Octal está sendo interpretado incorretamente? Algo a ver com o meu ambiente?

    
por Sri M. 19.03.2013 / 11:10

1 resposta

3

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.

    
por 19.03.2013 / 13:55