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?
# -i (inplace)
sed -i 's/[\d128-\d255]//g' FILENAME
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.
sed -i 's/[^[:print:]]//' FILENAME
Das wirkt auch wie dos2unix
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.
Versuchen Sie tr
anstelle von sed
tr -cd '[:print:]' < file.txt
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
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'
Das hat für mich funktioniert:
sed -i 's/[^[:print:]]//g'
awk '{ sub("[^a-zA-Z0-9\"[email protected]#$%^&*|_\[](){}", ""); print }' MYinputfile.txt > pipe_out_to_CONVERTED_FILE.txt
# -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.
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 ...
Für FILENAME muss der gesamte Pfad\name in Anführungszeichen gesetzt werden. Dies hat nicht funktioniert - %TEMP%\"FILENAME"
Das hat - %TEMP%\FILENAME"
sed hinterlässt temporäre Dateien im aktuellen Verzeichnis mit dem Namen sed *