
Ich habe eine Textdatei, die eine große Anzahl von Datensätzen enthält, die jeweils in einer einzelnen Zeile stehen. Einige der Datensätze enthalten beschädigte Sonderzeichen, und ich versuche, diese zu finden, indem ich nach mehreren Zeichenfolgen suche, die höher sind alsx80
Hier ist ein einzeiliges Beispiel mit hervorgehobenen falschen Zeichen:
Die relevante Hexadezimalzeichenfolge lautet:
49 CC 80 C2 B9 6E
Wenn ich GNU Grep verwende, grep --color='auto' -P -n "[\x80-\xFF]" record.txt
stimmt nur ein Teil der Zeile überein, nämlich die hochgestellte 1 ( ¹
), nicht aber das Ì
:
Grep scheint nicht in der Lage zu sein, die Kombination aus Buchstaben und diakritischen Zeichen aufzuteilen …
Ich möchte nur die Zeilen behalten, die zwei oder mehr aufeinanderfolgende x80
Zeichen haben – und in der Lage sein, mit den tatsächlichen Zeichen übereinzustimmen, die im Hex-Code auftauchen – es 49 CC 80 C2 B9 6E
scheint also, als ob es mit etwas wie übereinstimmen sollte "[\x80-\xFF]{2,10}"
– aber dieser Abgleich funktioniert nicht.
Zur Klarstellung: Wenn ich dies verwende, stimmt die Zeile überein mit:
grep --color='auto' -P -n "[\x80-\xFF]" record.txt
Aber wenn ich dies verwende, passiert Folgendes nicht:
grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
Sollte das Zweite nicht auch übereinstimmen, da die Bytefolge ist, CC 80 C2 B9
die eine Zeichenfolge aus 4 aufeinanderfolgenden Bytes mit den Werten ist x80-xFF
?
Antwort1
Dies könnte mit dem Gebietsschema zusammenhängen. Wenn ja, könnte die Verwendung des Gebietsschemas C (auch bekannt als POSIX), bei dem Zeichen Bytes sind, funktionieren:
LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
Antwort2
Grep kann bei ungewöhnlichen Zeichen fehlerhaft sein. Versuchen Sie Folgendes:
grep --color='auto' -P -n "[\x80-\xFF]" record.txt | iconv -f utf-16 -t utf-16
Möglicherweise erhalten Sie Ihre Buchstaben zurück, aber Ihre Farben gehen verloren. Es könnte sich lohnen, mit UTF-16 und UTF-8 herumzuspielen.
Und stellen Sie sicher, dass Ihre Konsole UFT-8 verarbeiten kann und nicht einer ANSI-Einstellung zugewiesen ist.