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:
¿Identificar qué líneas del archivo contienen caracteres nulos? He intentado greping para
\0
y\x0
, pero esto no funcionó.¿Eliminar los caracteres nulos? Ejecutar
strings
en el archivo lo limpió, pero me pregunto si esta es la mejor manera.
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.
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.
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.
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'
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
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?
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.
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')
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