Eu tenho um arquivo de texto contendo caracteres nulos indesejados (ASCII NUL, \0
). Quando tento visualizá-lo vi
, vejo ^@
símbolos intercalados em texto normal. Como posso:
Identificar quais linhas no arquivo contêm caracteres nulos? Tentei usar o grep para
\0
e\x0
, mas não funcionou.Remover os caracteres nulos? Executando
strings
no arquivo limpei, mas eu só estou me perguntando se esta é a melhor maneira?
unix
shell
null
special-characters
dogbane
fonte
fonte
Respostas:
Eu usaria
tr
:Se você está se perguntando se o redirecionamento de entrada no meio dos argumentos do comando funciona, ele funciona. A maioria das conchas irá reconhecer e lidar com I / O redirecionamento (
<
,>
...) em qualquer lugar na linha de comando, na verdade.fonte
tr -d '\000' < file-with-nulls > file-without-nulls
já que<
faz parte da funcionalidade do shell pipe e nãotr
.cat |
. Uma solução boa e limpa que resolveu meu problema.Use o seguinte comando sed para remover os caracteres nulos em um arquivo.
esta solução edita o arquivo no local, importante se o arquivo ainda estiver sendo usado. passando -i'ext 'cria um backup do arquivo original com o sufixo' ext 'adicionado.
fonte
sed -i
requer uma extensão no próximo argumento, mas pode estar vazia. Nesses sistemas, adicione um''
, como em:sed -i '' 's/\x0//g "$FILE"
.tr
para mim$ sed --version
->sed (GNU sed) 4.7
, tive que usar a seguinte invocação para obter um arquivo de backup chamadoexample.csv.bak
:sed -i.bak 's/\x0//g' example.csv
Um grande número de caracteres NUL indesejados, digamos um a cada dois bytes, indica que o arquivo está codificado em UTF-16 e que você deve usar
iconv
para convertê-lo em UTF-8.fonte
iconv -f UTF-16 -t UTF-8 file
.Eu descobri o seguinte, que imprime quais linhas, se houver, têm caracteres nulos:
Além disso, um despejo octal pode informar se há nulos:
fonte
Se as linhas do arquivo terminarem com \ r \ n \ 000, o que funciona é excluir \ n \ 000 e substituir \ r por \ n.
fonte
Aqui está um exemplo de como remover caracteres NULL usando
ex
(no local):e para vários arquivos:
Para recursividade, você pode usar a opção globbing
**/*.txt
(se for suportada pelo seu shell).Útil para scripts, pois
sed
e seu-i
parâmetro é uma extensão BSD não padrão.Veja também: Como verificar se o arquivo é binário e ler todos os arquivos que não são?
fonte
Eu usei:
para se livrar dos zeros no arquivo.
fonte
Eu enfrentei o mesmo erro com:
Resolvi o problema mudando a codificação para
utf-16
fonte