J’ai un fichier texte contenant des caractères nuls indésirables (ASCII NUL, \0
). Quand j’essaie de le voir en vi
je vois les 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? Les ssortingngs
cours d’exécution sur le fichier le nettoyaient, mais je me demandais si c’était le meilleur moyen?
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 la commande fonctionne, elle le fait. La plupart des shells reconnaissent et traitent la redirection d’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 toujours utilisé. Pass -i’ext ‘crée une sauvegarde du fichier d’origine avec le suffixe’ ext ‘ajouté.
Un grand nombre de caractères NUL indésirables, disons un octet sur deux, indique que le fichier est codé en UTF-16 et que vous devez utiliser iconv
pour le convertir en UTF-8.
J’ai découvert ce qui suit, qui affiche 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 indiquer s’il y a des valeurs nulles:
od file-with-nulls | grep ' 000'
Si les lignes du 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\000' outfile
Voici un exemple comment supprimer les caractères NULL 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 l’ option de globalisation **/*.txt
(si elle est prise en charge 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 binary et lire tous les fichiers qui ne le sont pas?
J’ai utilisé:
recode UTF-16..UTF-8
se débarrasser des zéros dans le fichier.