Identifier et supprimer les caractères nuls dans UNIX
j'ai un fichier texte contenant des caractères nuls non désirés (ASCII NUL, " 151900920"
). Quand j'essaie de le voir dans vi
je vois les symboles ^@
, entrelacés dans un texte normal. Comment puis-je:
-
identifier quelles lignes dans le fichier contiennent des caractères nuls? J'ai essayé de grêler pour
" 151900920 "
etx0
, mais cela n'a pas fonctionné. -
supprimer les caractères nuls? Exécuter
strings
sur le dossier a tout nettoyé, mais je me demande si c'est la meilleure façon?
8 réponses
j'utiliserais tr
:
tr < file-with-nulls -d '"151900920"0' > file-without-nulls
si vous vous demandez si la redirection d'entrée au milieu des arguments de commande fonctionne, elle fonctionne. La plupart des shells reconnaîtront et traiteront 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 dans un fichier.
sed -i 's/\x0//g' null.txt
cette solution édite le fichier en place, important si le fichier est encore utilisé. passing-l'ext ' crée une sauvegarde du fichier original avec le suffixe 'ext' ajouté.
un grand nombre de caractères NUL non désirés, disons un octet sur un autre, indique que le fichier est encodé en UTF-16 et que vous devez utiliser iconv
pour le convertir en UTF-8.
j'ai découvert ce qui suit, qui imprime sur quelles lignes, le cas échéant, ont des caractères nuls:
perl -ne '/"151900920"0/ and print;' file-with-nulls
aussi, une décharge octale peut vous dire s'il y a des nulls:
od file-with-nulls | grep ' 000'
si les lignes dans le fichier se terminent par \R\n\000 alors ce qui fonctionne est de supprimer le \N\000 puis de remplacer le \r par \N.
tr -d '\n"151900920"0' <infile | tr '\r' '\n' >outfile
voici un exemple comment supprimer les caractères nuls en utilisant ex
(en 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 option globbing **/*.txt
(si elle est supportée par votre shell).
utile pour le script 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>
pour 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 changeant l'encodage utf-16
f=cd.open(filePath,'r','utf-16')