web-dev-qa-db-de.com

Entfernen Sie Nicht-ASCII-Zeichen aus CSV

Ich möchte alle Nicht-ASCII-Zeichen aus einer Datei entfernen.

Ich habe eine Lösung mit tr gefunden, aber ich denke, ich muss diese Datei nach der Änderung zurückschreiben.

Ich muss es mit relativ guter Leistung vor Ort tun.

Irgendwelche Vorschläge?

48
Sujit
# -i (inplace)

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

Ein Perl-Oneliner würde Folgendes tun: Perl -i.bak -pe 's/[^[:ascii:]]//g' <your file>

-i sagt, dass die Datei an Ort und Stelle bearbeitet wird und das Backup mit der Erweiterung .bak gespeichert wird.

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

Das wirkt auch wie dos2unix

13
jcalfee314

Ich habe alle Lösungen ausprobiert und nichts hat funktioniert. Folgendes tut jedoch:

tr -cd '\11\12\15\40-\176'

Was ich hier gefunden habe:

https://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix

Mein Problem bestand darin, dass es eine Reihe von Pipe-Programmen war und nicht direkt aus einer Datei. Ändern Sie sie bei Bedarf.

12
Katastic Voyage

Versuchen Sie tr anstelle von sed

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

Ich verwende ein sehr minimales Belegtbox-System, bei dem Bereiche in tr oder POSIX-Zeichenklassen nicht unterstützt werden, also muss ich es auf die beschissene, altmodische Weise tun. Hier ist die Lösung mit sed, die ALLE nicht druckbaren Nicht-ASCII-Zeichen aus der Datei entfernt:

sed -i 's/[^a-zA-Z 0-9`[email protected]#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' FILE
4
ACK_stoverflow

Als Alternative zu sed oder Perl können Sie erwägen, die Zeichenklassen ed (1) und POSIX zu verwenden.

Hinweis: ed (1) liest die gesamte Datei in den Speicher, um sie direkt zu bearbeiten. Für sehr große Dateien sollten Sie 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

Das hat für mich funktioniert:

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

LANG=C sed -i 's/[\d128-\d255]//g' FILENAME

Die Aufgabe des LANG=C-Teils besteht darin, einen Invalid collation character-Fehler zu vermeiden.

Basierend auf Iwans Antwort und Patricks Kommentar.

1
Nicolas Raoul

Ich schätze die Tipps, die ich auf dieser Website gefunden habe.

Aber auf meinem Windows 10 musste ich doppelte Anführungszeichen verwenden, damit dies funktioniert ...

sed -i "s/[\d128-\d255]//g" FILENAME

Bemerkte diese Dinge ...

  1. Für FILENAME muss der gesamte Pfad\name in Anführungszeichen gesetzt werden. Dies hat nicht funktioniert - %TEMP%\"FILENAME" Das hat - %TEMP%\FILENAME"

  2. sed hinterlässt temporäre Dateien im aktuellen Verzeichnis mit dem Namen sed *

0
Larry8811