Tengo un archivo de texto que contiene caracteres nulos no deseados (ASCII NUL \0
). Cuando intento verlo, vi
veo ^@
símbolos intercalados en texto normal. Cómo puedo:
¿Identifica qué líneas del archivo contienen caracteres nulos? Intenté grepping 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.
unix
shell
null
special-characters
dogbane
fuente
fuente
Respuestas:
Yo usaría
tr
:Si se pregunta si la redirección de entrada en medio de los argumentos del comando funciona, lo hace. La mayoría de las conchas se reconocer y tratar con E / S de cambio de dirección (
<
,>
, ...) en cualquier lugar de la línea de comandos, en realidad.fuente
tr -d '\000' < file-with-nulls > file-without-nulls
ya que<
es parte de la funcionalidad de la tubería de shell y notr
.cat |
. Una solución fina y limpia que resolvió mi problema.Utilice el siguiente comando sed para eliminar los caracteres nulos en un archivo.
esta solución edita el archivo en su lugar, importante si el archivo todavía se está utilizando. al pasar -i'ext 'se crea una copia de seguridad del archivo original con el sufijo' ext 'agregado.
fuente
sed -i
requiere una extensión en el siguiente argumento, pero puede estar vacío. En esos sistemas, agregar una''
, como en:sed -i '' 's/\x0//g "$FILE"
.tr
para mí$ sed --version
->sed (GNU sed) 4.7
, tuve que usar la siguiente invocación para obtener un archivo de respaldo llamadoexample.csv.bak
:sed -i.bak 's/\x0//g' example.csv
Una gran cantidad de caracteres NUL no deseados, digamos uno cada dos bytes, indica que el archivo está codificado en UTF-16 y que debe usar
iconv
para convertirlo a UTF-8.fuente
iconv -f UTF-16 -t UTF-8 file
.Descubrí lo siguiente, que imprime qué líneas, si las hay, tienen caracteres nulos:
Además, un volcado octal puede indicarle si hay nulos:
fuente
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.
fuente
A continuación, se muestra un ejemplo de cómo eliminar caracteres NULL usando
ex
(en el lugar):y para varios archivos:
Para la recursividad, puede usar la opción globbing
**/*.txt
(si es compatible con su shell).Útil para la creación de scripts ya que
sed
su-i
parámetro es una extensión BSD no estándar.Consulte también: ¿Cómo comprobar si el archivo es un archivo binario y leer todos los archivos que no lo son?
fuente
Solía:
para deshacerse de los ceros en el archivo.
fuente
Me enfrenté al mismo error con:
Resolví el problema cambiando la codificación a
utf-16
fuente