Wie entferne ich nicht ASCII Zeichen aus einer Datei?Entfernen Sie Nicht-ASCII-Zeichen in einer Datei
Antwort
Wenn Sie Perl verwenden möchten, tun Sie es wie folgt aus:
perl -pi -e 's/[^[:ascii:]]//g' filename
Detaillierte Erläuterung
Die folgende Erklärung jeden Teil des obigen Befehl deckt den Leser unter der Annahme, die nicht mit alles in der Lösung ...
perl
den Perl-Interpreter ausführen. Perl ist eine Programmiersprache, die typischerweise auf allen Unix-ähnlichen Systemen verfügbar ist. Dieser Befehl muss an einer Shell-Eingabeaufforderung ausgeführt werden.
-p
Die
-p
Flag teilt perl jede Zeile in der Eingabedatei iterieren, die spezifizierten Befehle ausführen (später beschrieben) in jeder Zeile, und dann das Ergebnis drucken. Es entspricht dem Wrapping Ihres Perl-Programms inwhile(<>) { /* program... */; } continue { print; }
. Es gibt eine ähnliche-n
Flagge, die das gleiche tut, aber dencontinue { print; }
Block weglässt, also würden Sie das verwenden, wenn Sie Ihren eigenen Druck machen wollten.-i
Die
-i
Flag teilt Perl dass die Eingabedatei an Ort und Stelle und Ausgabe bearbeitet werden soll, sollte wieder in diese Datei gehen. Dies ist wichtig, um die Datei tatsächlich zu ändern. Wenn Sie dieses Flag auslassen, wird die Ausgabe inSTDOUT
geschrieben, die Sie dann in eine neue Datei umleiten können.Hinweis, die Sie nicht
-i
weglassen undSTDOUT
auf die Eingabedatei umleiten, da dies die Eingabedatei verprügeln, bevor es gelesen wurde. So funktioniert die Shell und hat nichts mit Perl zu tun. Die-i
-Flagge funktioniert auf intelligente Weise.Perl und die Schale können Sie mehrere einzelne Zeichen Parameter zu einem kombinieren, weshalb wir
-pi
statt-p -i
Die
-i
Flagge nimmt ein einziges Argument verwenden, die eine Dateierweiterung ist zu verwenden, wenn Sie möchten, Wenn Sie-i.bak
verwendet haben, kopiert Perl die Eingabedatei infilename.bak
, bevor Sie Änderungen vornehmen.In diesem Beispiel habe ich weggelassen ein Backup erstellen, da erwarte ich werde Sie Versionskontrolle verwenden sowieso :)-e
Die
-e
Flag teilt Perl, dass das nächste Argument ist ein komplettes Perl-Programm in einem gekapselten Zeichenfolge. Dies ist nicht immer eine gute Idee, wenn Sie ein sehr langes Programm haben, da dieses unlesbar wird, aber mit einem einzigen Befehlsprogramm, wie wir es hier haben, kann seine Kürze die Lesbarkeit verbessern.Hinweis, dass wir die
-e
Flagge mit der-i
Flagge als sie beide nimmt in einem einzigen Argumente nicht kombinieren können, und Perl würde davon ausgehen, dass das zweite Flag das Argument, so zum Beispiel, wenn wir-ie <program> <filename>
verwendet, perl würde annehmen,<program>
und<filename>
sind beide Eingabedateien und versuchen,<program>e
und<filename>e
unter der Annahme, dasse
ist die Erweiterung, die Sie für die Sicherung verwenden möchten. Dies wird fehlschlagen, da<program>
nicht wirklich eine Datei ist. Andersherum (-ei
) würde auch nicht funktionieren, weil Perl versuchen würde,i
als ein Programm auszuführen, das Kompilierung fehlschlagen würde.s/.../.../
Dies ist regex basiert Substitution Bediener Perl. Es nimmt vier Argumente auf. Der erste kommt vor dem Operator und wenn nicht angegeben, wird der Standardwert
$_
verwendet. Die zweite und dritte sind zwischen den/
Symbolen. Der vierte ist nach dem letzten/
und ist in diesem Fallg
.$_
In unserem Code ist das erste Argument$_
die die variable Standardschleife ist in Perl. Wie oben erwähnt, umschließt das Flag-p
unser Programm inwhile(<>)
, das einewhile
Schleife erstellt, die jeweils eine Zeile (<>
) vom Eingang liest. Implizit wird diese Zeile$_
zugewiesen, und alle Befehle, die ein einzelnes Argument verwenden, verwenden dies, wenn sie nicht angegeben werden (z. B. wird nur der Aufrufprint;
tatsächlich inprint $_;
übersetzt). In unserem Code arbeitet der Operators/.../.../
einmal in jeder Zeile der Eingabedatei.[^[:ascii:]]
Das zweite Argument ist das Muster, nach dem in der Eingabezeichenfolge gesucht werden soll. Dieses Muster ist ein regulärer Ausdruck, also ist alles, was in[]
eingeschlossen ist, ein Klammerausdruck. Dieser Abschnitt ist wahrscheinlich der komplexeste Teil dieses Beispiels, weshalb wir ihn am Ende im Detail besprechen werden.<empty string>
Das dritte Argument ist die Ersetzungszeichenfolge, in unserem Fall die leere Zeichenfolge, da wir alle nicht-ASCII-Zeichen entfernen möchten.g
Das vierte Argument ist ein Modifikatorflag für den Substitutionsoperator. Das Flagg
gibt an, dass die Ersetzung für alle Übereinstimmungen in der Eingabe global sein soll. Ohne dieses Flag wird nur die erste Instanz ersetzt.Andere mögliche Flags sindi
für case insensitive Matches,s
undm
, die nur für mehrzeilige Strings relevant sind (wir haben hier einfache Strings),o
, die angeben, dass das Muster vorkompiliert werden soll (was hier für lange Dateien nützlich sein könnte) undx
, die angibt, dass das Muster Whitespace und Kommentare enthalten kann, um es lesbarer zu machen (aber wir sollten unser Programm nicht in einer einzelnen Zeile schreiben, wenn das der Fall ist).
filename
Dies ist die Eingabedatei, die Nicht-ASCII-Zeichen enthält, die wir Streifen aus möchten.
[^[:ascii:]]
So, jetzt die [^[:ascii:]]
näher diskutieren lassen.
Wie bereits erwähnt, gibt []
in einem regulären Ausdruck einen Klammerausdruck an, der der Regex-Engine ein einzelnes Zeichen in der Eingabe zuordnet, das mit einem der Zeichen in der Zeichengruppe innerhalb des Ausdrucks übereinstimmt. So passt zum Beispiel [abc]
entweder a
oder b
oder c
, und es wird nur ein einzelnes Zeichen übereinstimmen. Wenn ^
als erstes Zeichen verwendet wird, wird die Übereinstimmung invertiert, sodass [^abc]
mit einem beliebigen Zeichen übereinstimmt, das kein a
, b
oder c
ist.
Aber was ist mit [:ascii:]
innerhalb der Klammer Ausdruck?
Wenn Sie ein Unix-basiertes System verfügbar haben, führen Sie in der Befehlszeile man 7 re_format
aus, um die Manpage zu lesen. Wenn nicht, read the online version
[:ascii:]
ist eine Charakter-Klasse, die den gesamten Satz von ascii
Zeichen darstellt, aber diese Art von einer Zeichenklasse kann nur in einem Ausdruck in eckigen Klammern verwendet werden. Der richtige Weg, um dies zu verwenden, ist [[:ascii:]]
und es kann wie oben mit dem abc
Fall negiert oder in einem Klammerausdruck mit anderen Zeichen kombiniert werden, so dass zum Beispiel [éç[:ascii:]]
alle ASCII-Zeichen sowie é
und ç
übereinstimmen, die nicht als ASCII sind, und [^éç[:ascii:]]
werden alle Zeichen übereinstimmen, die nicht ASCII sind und auch nicht é
oder ç
.
tr -dc [:graph:][:cntrl:] < input-file > cleaned-file
Angenommen, Sie möchten "Kontroll" -Zeichen und "druckbare" Zeichen beibehalten. Geige nach Bedarf.
'tr -dc '\ 11 \ 12 \ 15 \ 40- \ 176'
Meine two cents: Es kann nicht Ihr Problem lösen, aber es kann Ihnen einige Hinweise geben.
Der Befehl file
teilt Ihnen die Dateicodierung mit, d. H. UTF, ASCII usw. und iconv
kann eine Datei zwischen verschiedenen Codierungen konvertieren.
iconv überraschenderweise entkleidet einige andere Sachen auch auf der XML-Datei .. ich habe iconv -f ascii -t ascii -c – janar
perl -pe's/[[:^ascii:]]//g' <input.txt> output.txt
Dies ist genau das, was ich getan habe, um das Problem zu beheben. – janar
Sie können ein C-Programm wie folgt schreiben:
#include <stdio.h>
#include <ctype.h>
int main(int argc, char **argv)
{
FILE *fin = fopen("source_file", "rb");
FILE *fout = fopen("target_file", "w");
int c;
while ((c = fgetc(fin)) != EOF) {
if (isprint(c))
fputc(c, fout);
}
fclose(fin);
fclose(fout);
return 0;
}
Hinweis: Fehlerprüfungen wurden der Einfachheit halber vermieden.
Kompilieren mit:
$ gcc -W source_code.c -o convert
Run mit:
$ ./convert
- 1. Entfernen Sie eine Stückliste in einer Datei
- 2. Entfernen Sie Zeichen in einer Datei (bash).
- 3. So entfernen Sie Änderungen in einer Datei in hg
- 4. Entfernen Sie doppelte Zeilen aus einer großen Datei in Python
- 5. Entfernen Sie alle Leerzeichen in einer Datei - Linux
- 6. Entfernen Sie führende Nullen in Batch-Datei
- 7. Entfernen Backslash in einer Datei mit Powershell
- 8. Entfernen Whitespaces in einer CSV-Datei
- 9. Entfernen Sie Kennwortschutz aus einer Outlook-PST-Datei programmgesteuert
- 10. Entfernen Sie Zeilen mit japanischen Zeichen aus einer Datei
- 11. Python - So entfernen Sie Spalten aus einer Datei
- 12. Entfernen von Daten aus einer HDF5-Datei
- 13. Entfernen Sie Zeilen mit einem Schlüsselwort aus einer Datei
- 14. Entfernen einer Datei von SubVersion/SmartSVN
- 15. Entfernen identischer Koordinaten an einer bestimmten Stelle in einer Datei
- 16. Entfernen Sie Daten in einer großen TXT-Datei aller Vorkommen in einer Datenbanktabelle
- 17. Entfernen von Zeichen aus einer CSV-Datei
- 18. Entfernen von Duplikaten aus einer Staging-Datei
- 19. Entfernen von Steuerzeichen aus einer Datei
- 20. So entfernen Sie Duplikate in einer Arraylist
- 21. Entfernen Sie C++ - Klassennamen aus Binärdll-Datei
- 22. Entfernen von c Kommentare aus einer Datei
- 23. entfernen Sie Elemente in einer Liste in einer anderen Liste
- 24. So entfernen Sie das Datumsformat aus einer Zeile in einer TXT-Datei mit einem Java?
- 25. Wie Entfernen einer Datei in Svn rückgängig zu machen
- 26. Entfernen Sie überschüssige Leerzeichen aus einer Zeichenfolge
- 27. Entfernen Sie doppelte Zeilen und überschreiben Datei in demselben Befehl
- 28. sed Dienstprogramm entfernen Sie alle Zeichen in der Datei
- 29. Entfernen Sie alle Objekte aus einer UIView
- 30. QFile :: entfernen nicht Datei entfernen?
Es gibt einen sehr ähnlichen Thread hier ist, fragt etwa in UNIX in einer Datei Nicht-ASCII-Zeichen zu finden: http: // Paketüberfluss.com/questions/3001177/how-do-i-grep-für-nicht-ascii-zeichen-in-unix – hotshot309