Identificar y eliminar 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 del archivo contienen caracteres nulos? He intentado greping 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.

Author: Tom Howard, 2010-03-08

8 answers

Usaría tr:

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

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

 90
Author: Pointy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-27 03:06:52

Utilice el siguiente comando sed para eliminar los caracteres null 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'text 'crea una copia de seguridad del archivo original con el sufijo' ext ' añadido.

 49
Author: rekha_sri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-08 16:12:03

Un gran número de caracteres NUL no deseados, digamos uno cada otro byte, indica que el archivo está codificado en UTF-16 y que debe usar iconv para convertirlo a UTF-8.

 16
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-07 23:16:06

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 decirte si hay nulos:

od file-with-nulls | grep ' 000'
 5
Author: dogbane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-08 08:08:31

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

tr -d '\n\000' <infile | tr '\r' '\n' >outfile
 5
Author: wwmbes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-24 10:41:58

Aquí hay un ejemplo de cómo eliminar caracteres NULOS usando ex (in-place):

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

Y para múltiples archivos:

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

Para la recursividad, puede usar la opción de desplazamiento **/*.txt (si está soportado por su shell).

Útil para scripting ya que sed y su parámetro -i es una extensión BSD no estándar.

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

 2
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-30 13:13:36

He utilizado:

recode UTF-16..UTF-8 <filename>

Para deshacerse de los ceros en el archivo.

 1
Author: logisec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-17 13:00:49

Me enfrenté al mismo error con:

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

Resolví el problema cambiando la codificación a utf-16

f=cd.open(filePath,'r','utf-16')
 0
Author: Ming Young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-04 07:00:59