Identifier et supprimer les caractères null dans UNIX

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:

  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? 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.