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:
Identifiez les lignes du fichier contenant des caractères nuls? J'ai essayé grepping pour \0
et \x0
, mais cela n'a pas fonctionné.
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?
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.
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é.
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.
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
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'
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?
J'ai utilisé:
recode UTF-16..UTF-8 <filename>
se débarrasser des zéros dans le fichier.
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')