web-dev-qa-db-fra.com

Supprimer les caractères non-ASCII de CSV

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?

48
Sujit
# -i (inplace)

sed -i 's/[\d128-\d255]//g' FILENAME
39
Ivan

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.

66
ssegvic
sed -i 's/[^[:print:]]//' FILENAME

En outre, cela agit comme dos2unix

13
jcalfee314

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.

12
Katastic Voyage

Essayez tr au lieu de sed

tr -cd '[:print:]' < file.txt
6
Vivek

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
4
ACK_stoverflow

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'
3
trevor

Cela a fonctionné pour moi:

sed -i 's/[^[:print:]]//g'
3
AJn
awk '{ sub("[^a-zA-Z0-9\"!@#$%^&*|_\[](){}", ""); print }' MYinputfile.txt > pipe_out_to_CONVERTED_FILE.txt
2
guestSA
# -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.

1
Nicolas Raoul