Identificación y eliminación de caracteres nulos en UNIX

Tengo un archivo de texto que contiene caracteres nulos no deseados (ASCII NUL, \0 ). Cuando trato de verlo en vi veo ^@ símbolos, intercalados en texto normal. Cómo puedo:

  1. Identificar qué líneas en el archivo contienen caracteres nulos? He intentado grepping para \0 y \x0 , pero esto no funcionó.

  2. Eliminar los caracteres nulos? Ejecutar strings en el archivo lo limpió, pero me pregunto si esta es la mejor manera.

Yo usaría tr :

 tr < file-with-nulls -d '\000' > file-without-nulls 

Si se está preguntando si la redirección de entrada en el medio de los argumentos del comando funciona, lo hace. La mayoría de las shells reconocerán y manejarán la redirección de E / S ( < , > , ...) en cualquier lugar de la línea de comando, en realidad.

Use el siguiente comando sed para eliminar los caracteres nulos en un archivo.

 sed -i 's/\x0//g' null.txt 

esta solución edita el archivo en su lugar, importante si el archivo todavía se está utilizando. passing -i’ext ‘crea una copia de seguridad del archivo original con el sufijo’ ext ‘agregado.

Una gran cantidad de caracteres NUL no deseados, por ejemplo, uno por cada byte, indica que el archivo está codificado en UTF-16 y que debe usar iconv para convertirlo a UTF-8.

Descubrí lo siguiente, que muestra qué líneas, si las hay, tienen caracteres nulos:

 perl -ne '/\000/ and print;' file-with-nulls 

Además, un volcado octal puede indicarle si hay nulos:

 od file-with-nulls | grep ' 000' 

Si las líneas del archivo terminan con \ r \ n \ 000, entonces lo que funciona es eliminar \ n \ 000 y luego reemplazar \ r \ n con \ n.

 tr -d '\n\000' outfile 

Aquí hay un ejemplo de cómo eliminar caracteres NULL usando ex (en contexto):

 ex -s +"%s/\%x00//g" -cwq nulls.txt 

y para múltiples archivos:

 ex -s +'bufdo!%s/\%x00//g' -cxa *.txt 

Para recursividad, puede usar la opción globbing **/*.txt (si es compatible con su shell).

Es útil para la creación de scripts desde sed y su parámetro -i es una extensión BSD no estándar.

Vea también: ¿Cómo verificar si el archivo es un archivo binario y leer todos los archivos que no lo son?

Solía:

 recode UTF-16..UTF-8  

para deshacerse de ceros en el archivo.

Me enfrenté al mismo error con:

 import codecs as cd f=cd.open(filePath,'r','ISO-8859-1') 

Resolví el problema cambiando la encoding a utf-16

 f=cd.open(filePath,'r','utf-16')