Wie entferne ich alle Nicht-ASCII-Zeichen aus einer Datei? Würde es einen bestimmten Befehl geben, um dies auszuführen?
grep --colour='auto' -P -n'[^\x00-\x7]' /usr/local/...
Ich glaube, dies findet die Zeichen innerhalb des Workflows, aber wie würde ich alle Instanzen der fraglichen Zeichen entfernen?
text-processing
ascii
Mizole Ni
quelle
quelle
cat -v
in ASCII-Repräsentation für sie anzeigen. (^G
\007
Antworten:
ASCII-Zeichen sind Zeichen im Bereich von 0 bis einschließlich 177 (oktal) .
Verwenden Sie, um Zeichen außerhalb dieses Bereichs in einer Datei zu löschen
Der
tr
Befehl ist ein Dienstprogramm, das einzelne Zeichen bearbeitet , entweder durch andere einzelne Zeichen ersetzt (Transliteration), löscht oder Läufe desselben Zeichens zu einem einzelnen Zeichen komprimiert.Der obige Befehl würde
file
den geänderten Inhalt lesen und in ihn schreibennewfile
. Mit dieser-d
Optiontr
löscht das Dienstprogramm Zeichen (anstatt sie zu transliterieren) und-c
berücksichtigt Zeichen außerhalb des angegebenen Intervalls (statt innerhalb).LC_ALL=C
stellt sicher, dass jeder Byte-Wert ein gültiges Zeichen bildet. Ohne diesetr
Option würden einige Implementierungen abgebrochen, wenn Bytefolgen gefunden würden, die in der Zeichencodierung des Gebietsschemas keine gültigen Zeichen bilden.Verwenden Sie, um die Originaldatei durch die geänderte zu ersetzen
Dadurch wird die neue Datei nach erfolgreichem Abschluss in den Namen der alten Datei umbenannt
tr
. Wird dertr
Vorgang nicht erfolgreich abgeschlossen, da die ursprüngliche Datei nicht gelesen oder nicht in die neue Datei geschrieben werden konnte, bleibt die ursprüngliche Datei unverändert.Um die Metadaten (Berechtigungen usw.) der Originaldatei so weit wie möglich zu erhalten, verwenden Sie alternativ
quelle
Mit
perl
quelle
Wenn Sie nur einen regulären Ausdruck benötigen
[\x00-\x7F]
, den Sie auf mehrere Dienstprogramme anwenden können:Verstehen Sie, dass sed, awk und perl "Textdateien" wie in Unix definiert erwarten. In diesem Fall funktionieren alle gut. Insbesondere fügt awk jedoch eine nachgestellte neue Zeile hinzu (unabhängig davon, ob diese in der Quelldatei vorhanden war oder nicht) (mit printf werden ALLE neuen Zeilen in der Eingabe entfernt). Das tr kann mit jedem Dateityp verwendet werden. Das NUL (
\0
) ist jedoch kein gültiges Zeichen in einer POSIX-Textdatei und sollte vermieden werden:Tatsächlich würden viele Steuerzeichen unter bestimmten Bedingungen andere Probleme verursachen.
Also, wahrscheinlich brauchst du
[\x07-\x0d\x20-\x7e]
Der Bereich 7-13 (in Dezimal) ist
\a\b\t\n\v\f\r
(in Reihenfolge).Ein ähnlicher (wahrscheinlich portablerer) Bereich könnte als
[^[:space:][:print:]] (similar because it doesn't include
\ a \ b` (Glocke und Rücktaste) geschrieben werden.Verwandte:
Regex jedes ASCII-Zeichen
Perl-Lösung
Posix-Textdatei
quelle
tr
einen beliebigen Dateityp erfolgen kann, nicht nur für Textdateien.awk
Auf der anderen Seite nimmt eine Textdatei.gensub()
eine Gawk-Erweiterung ist. Sie möchtengsub(...); print
, und verwenden Sie Oktal anstelle von Hex-Sequenzen (und LC_ALL = C), um (mehr) portabel zu sein.[^\o0]
soll in POSIX mit anderen Zeichen als Backslash, o und 0 übereinstimmensed
(in allen Implementierungen außer GNU sed). Dies ist keine Einschränkung von GNU,sed
sondern eine nicht konforme Erweiterung, weshalb sie deaktiviert ist, wenn sich POSIXLY_CORRECT in der Umgebung befindet.