103 votes

Identifier et supprimer les caractères nuls dans UNIX

J'ai un fichier texte contenant des caractères nuls indésirables (ASCII NUL, \0 ). Lorsque j'essaie de le visualiser dans vi Je vois. ^@ des symboles, intercalés dans un texte normal. Comment puis-je :

  1. Identifier les lignes du fichier qui contiennent des caractères nuls ? J'ai essayé de rechercher \0 y \x0 mais cela n'a pas fonctionné.

  2. Supprimer les caractères nuls ? Exécution de strings sur le fichier l'a nettoyé, mais je me demande juste si c'est la meilleure façon ?

1 votes

Ce genre de question appartient probablement à SuperUser.com

2 votes

En fait, cette question est sur superuser.com : superuser.com/questions/75130/how-to-remove-ths-symbol-with-vim

135voto

Pointy Points 172438

J'utiliserais tr :

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

Si vous vous demandez si la redirection des entrées au milieu des arguments de commande fonctionne, c'est le cas. La plupart des interpréteurs de commandes reconnaissent et traitent la redirection d'E/S ( < , > ) n'importe où dans la ligne de commande, en fait.

0 votes

Et un "diff file-with-nulls file-without-nulls" devrait me montrer quelles lignes ont des caractères nuls ? Il en ressort beaucoup plus que prévu.

11 votes

En fait, je crois que ça devrait être tr -d '\000' < file-with-nulls > file-without-nulls depuis < fait partie de la fonctionnalité du shell pipe et non tr .

10 votes

La plupart des shells reconnaissent et traitent < ou > n'importe où dans la chaîne d'arguments, en fait. Cela m'a surpris aussi.

70voto

rekha_sri Points 1026

Utilisez la commande sed suivante pour supprimer les caractères nuls dans un fichier.

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

cette solution édite le fichier sur place, ce qui est important si le fichier est toujours utilisé. passer -i'ext' crée une sauvegarde du fichier original avec le suffixe 'ext' ajouté.

7 votes

Note : Dans FreeBSD (et je crois aussi Mac OS X), sed -i nécessite une extension dans l'argument suivant, mais il peut être vide. Dans ces systèmes, ajoutez un '' comme dans : sed -i '' 's/\x0//g "$FILE" .

2 votes

C'est un ordre de grandeur plus rapide que tr pour moi

0 votes

Pour moi, l'utilisation de Git pour Windows et $ sed --version -> sed (GNU sed) 4.7 j'ai dû utiliser l'invocation suivante pour obtenir un fichier de sauvegarde appelé example.csv.bak : sed -i.bak 's/\x0//g' example.csv

23voto

Un grand nombre de caractères NUL non désirés, par exemple un tous les deux octets, indique que le fichier est codé en UTF-16 et que vous devez utiliser le format iconv pour le convertir en UTF-8.

1 votes

J'ai manqué d'espace disque alors que mon application était en train de s'enregistrer. Il en résulte ces caractères.

0 votes

Par exemple, cela fonctionne en utilisant cette commande : iconv -f UTF-16 -t UTF-8 file .

7voto

dogbane Points 85749

J'ai découvert ce qui suit, qui permet de savoir quelles lignes, s'il y en a, contiennent des caractères nuls :

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

De plus, un dump octal peut vous indiquer s'il y a des zéros :

od file-with-nulls | grep ' 000'

0voto

Ming Young Points 1

J'ai rencontré la même erreur avec :

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

J'ai résolu le problème en changeant l'encodage en utf-16

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X