Je veux supprimer tous les caractères non-ASCII d'un fichier en place.
J'ai trouvé une solution avec tr, mais je suppose que je dois réécrire ce fichier après modification.
Je dois le faire en place avec une performance relativement bonne.
Aucune suggestion?
# -i (inplace)
sed -i 's/[\d128-\d255]//g' FILENAME
Un Perl oneliner ferait: Perl -i.bak -pe 's/[^[:ascii:]]//g' <your file>
-i
indique que le fichier va être édité sur place et que la sauvegarde sera enregistrée avec l'extension .bak
.
sed -i 's/[^[:print:]]//' FILENAME
En outre, cela agit comme dos2unix
J'ai essayé toutes les solutions et rien n'a fonctionné. Ce qui suit cependant:
tr -cd '\11\12\15\40-\176'
Ce que j'ai trouvé ici:
https://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix
Mon problème en avait besoin dans une série de programmes distribués, pas directement à partir d'un fichier, donc modifiez-les au besoin.
Essayez tr
au lieu de sed
tr -cd '[:print:]' < file.txt
J'utilise un système busybox très minimaliste, dans lequel il n'y a pas de prise en charge des plages dans les classes de caractères tr
ou POSIX, je dois donc le faire à l'ancienne. Voici la solution avec sed
, supprimant tous les caractères non-ASCII non imprimables du fichier:
sed -i 's/[^a-zA-Z 0-9`~!@#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' FILE
Au lieu de sed ou Perl, vous pouvez envisager d’utiliser les classes de caractères ed (1) et POSIX.
Remarque: ed (1) lit l'intégralité du fichier en mémoire pour le modifier sur place. Par conséquent, pour les fichiers très volumineux, vous devez utiliser sed -i ..., Perl -i ...
# see:
# - http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed
# - http://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes
# test
echo $'aaa \177 bbb \200 \214 ccc \254 ddd\r\n' > testfile
ed -s testfile <<< $',l'
ed -s testfile <<< $'H\ng/[^[:graph:][:space:][:cntrl:]]/s///g\nwq'
ed -s testfile <<< $',l'
Cela a fonctionné pour moi:
sed -i 's/[^[:print:]]//g'
awk '{ sub("[^a-zA-Z0-9\"!@#$%^&*|_\[](){}", ""); print }' MYinputfile.txt > pipe_out_to_CONVERTED_FILE.txt
# -i (inplace)
LANG=C sed -i 's/[\d128-\d255]//g' FILENAME
Le rôle de la partie LANG=C
consiste à éviter une erreur Invalid collation character
.
Basé sur la réponse d'Ivan et le commentaire de Patrick.