Como deixar apenas em determinados caracteres em um arquivo?

1

Propósito:

tr -cd '-6'

mas com acentos, ex .: á, í, ű, ö, ö, ü, å, ú, ó, é.

Em octal:

"á" is 341
"\n" is 12

Então eu tentei:

[user@notebook ~]$ printf 'XXXá\nXXX' | tr -cd '1' | cat -vte -
$
[user@notebook ~]$ 

Pergunta : Por que o tr não deixa "á" na saída? Talvez ele não saiba os caracteres da tabela ASCII estendida ou o quê?

ATUALIZAÇÃO:

[user@notebook small]$ printf 'árvíztűrő tükörf\túrógép\n' | strings -eS -n1
árvíztűrő tükörf    úrógép
[user@notebook small]$ 

A guia é desnecessária, mas a string a deixa.

UPDATE # 2:

[user@notebook ~]$ locale -a | grep hu_HU.utf8
hu_HU.utf8
[user@notebook ~]$ printf 'someárvíztűrő tükörf\túrógép\ntext' | LANG=hu_HU.utf8 sed 's/[\d128-\d255]//g;s/[\d000-\d031]//g' | cat -vte -
sed: -e expression #1, char 19: Invalid collation character
[user@notebook ~]$ 
    
por freaking-good-question 16.03.2015 / 08:03

2 respostas

1

"á" is 341

Não, não é. Seu conjunto de caracteres é UTF-8, no qual á é o caractere U + 00E1 que é codificado como a sequência de dois bytes \xc3\xa1 = 31 . Quando você escreve 1 no argumento para tr , ele é interpretado como o byte 1 .

it doesn't knows the extended ASCII table chars

Sim, é verdade - exceto que não existem “caracteres de tabela ASCII estendidos”: ASCII é um conjunto de caracteres de 7 bits. Você quis dizer conjuntos de caracteres que estendem ASCII e tr os suporta. tr processa caracteres de acordo com a localidade atual ou bytes.

tr -cd '-6' em ASCII significa manter caracteres imprimíveis e novas linhas. Em qualquer local, você pode dizer "caracteres imprimíveis" como [:print:] . \n é uma maneira mais clara de denotar novas linhas. Assim:

tr -cd '\n[:print:]'

Infelizmente, algumas implementações de tr (incluindo a versão GNU) não podem lidar com conjuntos de caracteres em UTF-8. Você pode usar sed em vez disso.

sed 's/[^[:print:]]//g'
    
por 17.03.2015 / 01:10
0

Use strings , por exemplo,

$ printf 'XXXhelloá\nYYY' | strings -es -n1
XXXhello
YYY

strings tem várias opções ( man strings para detalhes) para extrair texto (incluindo, -es, apenas caracteres de 7 bits) de uma string ou arquivo de entrada.

Se você deseja excluir mais caracteres "especiais", use sed:

# printf 'someárvíztűrő tükörf\túrógép\ntext' | LANG=C sed 's/[\d128-\d255]//g;s/[\d000-\d031]//g' | cat -vte -
somervztr tkrfrgp$
text$

Se você quiser combinar texto em uma linha, basta enviar o texto por meio de xargs, isso substitui um espaço por qualquer avanço de linha:

$ printf 'someárvíztűrő tükörf\túrógép\ntext' | xargs | LANG=C sed 's/[\d128-\d255]//g;s/[\d000-\d031]//g;s/\n//g' | cat -vte -
somervztr tkrf rgp text$
    
por 16.03.2015 / 08:20