web-dev-qa-db-fra.com

Identification et suppression des caractères nuls sous UNIX

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

  1. Identifiez les lignes du fichier contenant des caractères nuls? J'ai essayé grepping pour \0 et \x0, mais cela n'a pas fonctionné.

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

71
dogbane

Je voudrais utiliser tr:

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

Si vous vous demandez si la redirection d'entrée au milieu des arguments de la commande fonctionne, c'est le cas. La plupart des shells reconnaissent et gèrent la redirection des E/S (<, >,…) n'importe où dans la ligne de commande, en fait.

95
Pointy

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

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

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

52
rekha_sri

Un grand nombre de caractères NUL indésirables, un octet sur deux par exemple, indique que le fichier est codé en UTF-16 et que vous devez utiliser iconv pour le convertir en UTF-8.

16

Si les lignes du fichier se terminent par\r\n\000, l’opération consiste à supprimer le\n\000, puis remplacez le\r par\n.

tr -d '\n\000' <infile | tr '\r' '\n' >outfile
5
wwmbes

J'ai découvert ce qui suit, qui indique quelles lignes, le cas échéant, ont des caractères nuls:

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

De plus, un vidage octal peut vous dire s'il y a des NULL:

od file-with-nulls | grep ' 000'
5
dogbane

Voici un exemple comment supprimer des caractères NULL à l'aide de ex (in-place):

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

et pour plusieurs fichiers:

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

Pour la récursivité, vous pouvez utiliser l'option globbing**/*.txt (si elle est prise en charge par votre shell).

Utile pour les scripts depuis sed et son paramètre -i est une extension BSD non standard.

Voir aussi: Comment vérifier si le fichier est un fichier binaire et lire tous les fichiers qui ne le sont pas?

2
kenorb

J'ai utilisé:

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

se débarrasser des zéros dans le fichier.

1
logisec

J'ai fait face à 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 modifiant l'encodage en utf-16

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