armazena o arquivo com caracteres inválidos

1

Alguns arquivos que recebemos de um cliente não puderam ser processados corretamente porque foram declarados como US-ASCII, mas continham caracteres inválidos. Para validar uma correção de software, estou tentando copiar várias linhas do arquivo original para um novo arquivo. Os arquivos originais são bem grandes e eu só preciso de algumas linhas.

A linha original fica assim em gedit 003002002002\D4M , a parte \D4 em vermelho e recebo um aviso sobre caracteres inválidos. no console, a linha original é assim: 003002002002�M

Eu tentei enviar os arquivos por meio do cabeçalho & tail, mas o arquivo resultante contém um caractere 'fixo' em vez do inválido.

head -n 449025 invalid.txt | tail > invalid_short.txt

a linha fica assim se eu capturar o arquivo resultante: 003002002002�M mas se eu abrir o arquivo resultante com o gedit se parece com isso: 003002002002ÔM e não há caracteres inválidos

Eu tentei selecionar as linhas no gedit e salvá-las como um novo arquivo, mas só recebo uma representação do caractere inválido, não do original. Parece com cat e gedit (sem aviso de caracteres inválidos, sem vermelho): 003002002002\D4M

Parece que estou perdendo algo simples, mas não tenho ideia do que.

Obrigado

Ubuntu 16.04, zsh

    
por kostja 19.07.2016 / 17:25

1 resposta

4

head ou tail não corrigirá / alterará o caractere.

O que provavelmente acontece é que gedit tenta adivinhar a codificação do arquivo com base nos primeiros bytes. Quando esse 0xD4 está longe no arquivo, gedit supõe que o arquivo está em ASCII ou UTF-8 e queixa quando vê que o byte 0xD4 é inválido em ASCII ou UTF-8.

Enquanto para o segundo arquivo mais curto, já que 0xD4 está perto do começo do arquivo, gedit adivinha o conjunto de caracteres é algum conjunto de caracteres de 8 bits (provavelmente iso8859-1 onde 0xD4 é Ô).

Então, o seu:

head -n 449025 invalid.txt | tail > invalid_short.txt
O método

está correto. Se você executar sed -n l em ambos os arquivos, verá nos dois casos algo como 0030020020024M . E com hd : 30 30 33 30 30 32 30 30 32 30 30 32 d4 4d |003002002002.M| .

    
por 19.07.2016 / 17:32