
Eu tenho um executável que gera um arquivo de texto como saída. O problema é que o arquivo de texto sai com algum tipo de sinalizador de arquivo binário. O resultado é algo assim:
$ grep "grep string" output_file.txt
Binary file output_file.txt matches.
$ grep -a "grep string" output_file.txt
[correct results]
Algumas leituras indicaram que grep procura um caractere nulo nos primeiros mil bytes e depois determina se um arquivo é 'binário' ou não, então minha pergunta é dupla:
Existe uma maneira fácil de remover caracteres nulos dos meus arquivos (posso fazer isso como parte do meu pós-processamento) para garantir que o grep funcione corretamente sem o sinalizador -a?
Há algo óbvio que devo procurar em meu código para evitar que caracteres nulos sejam gravados no arquivo? Examinei o código detalhadamente e não vejo nenhum culpado óbvio.
.
Responder1
Posso responder pelo menos à primeira pergunta. Se você estiver usando Unix/Linux você pode usar tr
tr -d '\000' < filein > fileout
onde \000 é o caractere nulo. Você também pode remover todos os caracteres não imprimíveis, como pode ver no exemplo aqui:"Edição de texto Unix: sed, tr, cut, od, awk"
Em relação à sua segunda pergunta, não sei qual é a sua linguagem de programação, mas procuraria por variáveis não inicializadas que poderiam acabar sendo impressas no arquivo de saída.
Responder2
vou dar um palpite....
Seu programa grava o arquivo em UTF-16, uma codificação Unicode que usa dois bytes para cada caractere. Cada segundo byte é, na maioria das vezes, nulo.
iconv -f utf-16 -t utf-8 < filein > fileout
irá convertê-lo para UTF-8, com o qual a maioria dos coreutils se sente confortável.
Responder3
Outra opção poderia ser usarcordasferramenta, que na verdade é ainda mais poderosa do que apenas "consertar" codificação ou caracteres nulos, ela pode buscar dados de texto de qualquer binário real, então
$ strings arquivo_de_saída.txt | grep "string grep"
geralmente é bastante útil para encontrar rapidamente algo em um arquivo binário, por exemplo
$ strings firmware.bin | grep VERSÃO