429 Stimmen

Wie kann ich nach allen Nicht-ASCII-Zeichen fahnden?

Ich habe mehrere sehr große XML-Dateien, und ich versuche, die Zeilen zu finden, die Nicht-ASCII-Zeichen enthalten. Ich habe das Folgende versucht:

grep -e "[\x{00FF}-\x{FFFF}]" file.xml

Dies gibt jedoch jede Zeile in der Datei zurück, unabhängig davon, ob die Zeile ein Zeichen in dem angegebenen Bereich enthält.

Habe ich die Syntax falsch oder mache ich etwas anderes falsch? Ich habe es auch versucht:

egrep "[\x{00FF}-\x{FFFF}]" file.xml 

(wobei das Muster sowohl in einfachen als auch in doppelten Anführungszeichen steht).

1voto

arezae Punkte 41

Es könnte interessant sein, zu wissen, wie man nach einem Unicode-Zeichen sucht. Dieser Befehl kann dabei helfen. Sie müssen nur den Code in UTF8 kennen

grep -v $'\u200d'

1voto

noabody Punkte 109

Die Suche nach allen Nicht-Ascii-Zeichen erweckt den Eindruck, dass man entweder nach Unicode-Zeichenfolgen sucht oder beabsichtigt, diese Zeichen einzeln zu entfernen.

Für den ersten Fall versuchen Sie es mit einer der folgenden (variablen file wird für die Automatisierung verwendet):

 file=file.txt ; LC_ALL=C grep -Piao '[\x80-\xFF\x20]{7,}' $file | iconv -f $(uchardet $file) -t utf-8

 file=file.txt ; pcregrep -iao '[\x80-\xFF\x20]{7,}' $file | iconv -f $(uchardet $file) -t utf-8

 file=file.txt ; pcregrep -iao '[^\x00-\x19\x21-\x7F]{7,}' $file | iconv -f $(uchardet $file) -t utf-8

Vanilla grep funktioniert nicht korrekt ohne LC_ALL=C, wie in den vorherigen Antworten erwähnt.

Der ASCII-Bereich ist x00-x7F ist der Raum x20 Da Zeichenketten Leerzeichen haben, werden sie im negativen Bereich weggelassen.

Nicht-ASCII-Bereich ist x80-xFF Da Zeichenketten Leerzeichen haben, werden sie durch den positiven Bereich ergänzt.

Es wird davon ausgegangen, dass die Zeichenfolge aus mindestens 7 aufeinanderfolgenden Zeichen innerhalb des Bereichs besteht. {7,} .

Für eine shell-lesbare Ausgabe, uchardet $file gibt eine Schätzung der Dateikodierung zurück, die zur automatischen Interpolation an iconv übergeben wird.

0voto

Wenn Sie versuchen, UTF8-konforme Multibyte-Zeichen zu grab/grep, verwenden Sie dieses :

(                     [\302-\337][\200-\277]|
                [\340][\240-\277][\200-\277]|
                [\355][\200-\237][\200-\277]|
  [\341-\354\356-\357][\200-\277][\200-\277]|
     [\360][\220-\277][\200-\277][\200-\277]|
[\361-\363][\200-\277][\200-\277][\200-\277]|
     [\364][\200-\217][\200-\277][\200-\277]  ) 

 * please delete all newlines, spaces, or tabs in between (..)

 * feel free to use bracket ranges {1,3} etc to optimize
   the redundant listings of [\200-\277]. but don't change that
   [\200-\277]+, as that might result in invalid encodings 
    due to either insufficient or too many continuation bytes

 * although some historical UTF-8 references considers 5- and 
   6-byte encodings to be valid, as of Unicode 13 they only
   consider up to 4-bytes

Ich habe diese Zeichenkette sogar mit zufälligen Binärdateien getestet, und sie meldete die gleiche Anzahl von Multibyte-Zeichen wie gnu-wc.

Hinzufügen einer weiteren [\000-\177]| an der Front kurz nach ( wenn Sie eine vollständige UTF8-Zeichenkette benötigen.

Diese Regex ist wirklich hässlich, ja, aber sie ist auch POSIX-konform, sprach- und plattformübergreifend kompatibel (hängt nicht von einer speziellen Regex-Notation ab, (sollte) vollständig UTF-8-konform sein (Unicode 13) und ist völlig unabhängig vom Locale-Setting.

wenn Sie grep damit ausführen, verwenden Sie bitte grep -P

Wenn Sie nur die anderen Bytes benötigen, dann haben andere bereits vorgeschlagen.

wenn Sie die 11.172 Zeichen des NFC-komponierten koreanischen Hangul benötigen, ist es

(([\352][\260-\277]|[\353\354][\200-\277]|
 [\355][\200-\235])[\200-\277]|[\355][\236][\200-\243])

und wenn Sie japanische Hiragana+Katakana brauchen, ist es

([\343]([\201-\203][\200-\277]|[\207][\260-\277]))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X