Wie greife ich für alle Nicht-ASCII-Zeichen?
Ich habe mehrere sehr große XML-Dateien und ich bin versucht zu finden der Zeilen mit nicht-ASCII-Zeichen. Ich habe versucht, die folgenden:
grep -e "[\x{00FF}-\x{FFFF}]" file.xml
Aber das gibt jeder Zeile in der Datei, unabhängig davon, ob die Zeile enthält ein Zeichen im angegebenen Bereich.
Habe ich die syntax falsch, oder mache ich etwas anderes falsch? Ich habe auch versucht:
egrep "[\x{00FF}-\x{FFFF}]" file.xml
(mit einfachen und doppelten Anführungszeichen um das Muster).
InformationsquelleAutor der Frage pconrey | 2010-06-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie den Befehl verwenden:
Dies wird geben Sie die Nummer der Zeile und markieren Sie die nicht-ascii-Zeichen in rot.
In einigen Systemen, je nach Ihren Einstellungen, die oben nicht funktionieren, so können Sie grep durch die inverse
Beachten Sie auch, dass der wichtige Teil ist die
-P
- flag, das entspricht--perl-regexp
: so wird es interpretiert Muster als einen regulären Perl-Ausdruck. Er sagt auch, dassInformationsquelleAutor der Antwort jerrymouse
Anstelle von Annahmen über die byte-range von nicht-ASCII-Zeichen, als die meisten der oben genannten Lösungen das tun, es ist etwas besser IMO explizit über die tatsächliche byte-Reihe von ASCII-Zeichen statt.
Also die erste Lösung für die Instanz werden würde:
(die im Grunde greps für alle Zeichen außerhalb der hexadezimale ASCII-Bereich: von \x00 bis \x7F)
Auf Mountain Lion funktioniert nicht (aufgrund der fehlenden PCRE-Unterstützung für BSD grep)aber mit
pcre
installiert via Homebrew die folgenden arbeiten genauso gut:Irgendwelche vor-oder Nachteile, jeder kann denken?
InformationsquelleAutor der Antwort pvandenberk
Folgendes funktioniert bei mir:
Nicht-ASCII-Zeichen beginnen bei 0x80 und gehen bis 0xFF, wenn man die bytes. Grep (und Familie) nicht Unicode-Verarbeitung Zusammenführen multi-byte-Zeichen in einer einzigen juristischen Person, für die regex-matching, wie Sie zu wollen scheinen. Die
-P
option in meinem grep ermöglicht die Verwendung von\xdd
entweicht in Charakter-Klassen zu erreichen, was Sie wollen.InformationsquelleAutor der Antwort Thelema
In perl
InformationsquelleAutor der Antwort noquery
Der einfache Weg ist, um eine nicht-ASCII-Zeichen... als Zeichen, die keine ASCII-Zeichen.
Fügen Sie eine Registerkarte, die nach der
^
wenn nötig.Einstellung
LC_COLLATE=C
vermeidet böse überraschungen über die Bedeutung der Zeichen reicht in viele Gebietsschemas. EinstellungLC_CTYPE=C
ist notwendig, um match single-byte-Zeichen — andernfalls würde der Befehl zu verpassen Ungültiger byte-Sequenzen in der aktuellen Kodierung. EinstellungLC_ALL=C
vermeidet locale-abhängige Effekte insgesamt.InformationsquelleAutor der Antwort Gilles
Hier ist eine andere Variante, die ich gefunden, dass die produzierte komplett unterschiedliche Ergebnisse aus der grep-Suche für
[\x80-\xFF]
in der akzeptierten Antwort. Vielleicht wird es nützlich sein, jemand zu finden, zusätzliche, nicht-ascii-Zeichen:grep --color='auto' -P -n "[^[:ascii:]]" myfile.txt
Hinweis: mein computer ist grep (Mac) nicht
-P
option, so habe ichbrew install grep
und startete den Aufruf oben mitggrep
stattgrep
.InformationsquelleAutor der Antwort ryanm
Der folgende code funktioniert:
Ersetzen
/tmp
mit dem Namen des Verzeichnis, das Sie durchsuchen möchten.InformationsquelleAutor der Antwort user7417071
Seltsam, ich hatte, dies zu tun heute! Ich landete mit Perl, weil ich nicht bekommen konnte grep/egrep auf Arbeit (auch im P-Modus). So etwas wie:
Für unicode-Zeichen (wie
\u2212
im Beispiel unten) verwenden:InformationsquelleAutor der Antwort dty
Der Suche nach non-printable chars.
Ich Stimme mit Harvey oben begraben in den Kommentaren, ist es oft nützlich zur Suche für nicht-druckbare Zeichen ODER es ist einfach zu denken, non-ASCII, wenn Sie wirklich nachdenken sollten nicht-druckbare. Harvey schlägt vor, dass "die Nutzung dieser: "[^\n -~]". Hinzufügen von \r für DOS-text-Dateien. Das bedeutet: "[^\x0A\x020-\x07E]" und "\x0D für CR"
Auch das hinzufügen -c (Karte Anzahl der Muster abgestimmt) zu grep ist nützlich bei der Suche für die non-printable chars wie die Saiten abgestimmt versauen kann-terminal.
Fand ich hinzufügen range 0-8 und 0x0e-0x1f (0x80-0xff (mittelkampf) ist ein nützliches Muster. Dies schließt den TAB, CR und LF und ein oder zwei weitere ungewöhnliche druckbare Zeichen. Also IMHO ein durchaus eine nützliche (wenn auch grob) grep Muster ist DIESES:
Aufteilung:
E. g. praktisches Beispiel von suchen mit grep alle Dateien im aktuellen Verzeichnis:
Möchten Sie vielleicht anpassen des grep-mal. z.B. BS(0x08 - backspace -) Zeichen verwendet, in einigen druckbaren Dateien oder ausschließen(VT 0x0B - vertikale Registerkarte). Die BEL(0x07) und ESC(0x1B) chars können auch als druckfähige in einigen Fällen.
InformationsquelleAutor der Antwort gaoithe
Könnte es interessant sein, zu wissen, wie die Suche nach einem unicode-Zeichen. Dieser Befehl helfen kann. Sie brauchen nur zu wissen, den code in UTF8
InformationsquelleAutor der Antwort arezae