grep: Finde alle Zeilen, die japanische Kanjis enthalten

14

In einer riesigen UTF-8-Textdatei möchte ich alle Zeilen anzeigen , die japanische Kanjis enthalten .
Welcher grep(oder anderer) Ausdruck macht das?

Wenn ich mich nicht irre, sind Kanji die Zeichen zwischen \u4e00und \u4dbf.

Ich brauche keine Kanas zu zeigen , aber sie auch zu zeigen , wäre kein großes Problem.

Nicolas Raoul
quelle

Antworten:

12

Es ist unmöglich (ohne Verwendung einer riesigen Tabelle), ein japanisches Kanji von einem Han-Ideogramm zu unterscheiden, das nicht auf Japanisch verwendet wird (z. B. eine chinesische oder koreanische Variante).

Wenn Sie nur Han-Ideogramme im Basisbereich (\ u4e00 bis \ u9fff) erkennen möchten, werden sie in 3 Bytes codiert. Das erste Byte liegt immer zwischen 0xe4 und 0xe9, das zweite und dritte Byte zwischen 0x80 und 0xbf.

Hier gibt es zwei Schwierigkeiten: Zuerst müssen Sie grep mitteilen, dass Sie nach Bytes und nicht nach Zeichen suchen möchten. Dann müssen Sie die Bytes 0xe4, 0xe9, 0x80 und 0xbf eingeben, um sie in den Ausdruck regexp einzufügen.

Ich habe festgestellt, dass der -P-Schalter beides kann. und die gewünschte Zeile lautet:

grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]"

und wenn du auch kana willst:

grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]|\xe3[\x81-\x83][\x80-\xbf]"
Pablo Saratxaga
quelle
Das funktioniert super!
Nicolas Raoul
4

Nach der fünften Tabelle sind Kanji die Zeichen zwischen \u4e00und\u9fff

Meine Implementierung von grepscheint nicht in der Lage zu sein, Unicode-Zeichen zu verarbeiten (das ist GNU grep 2.14 unter Archlinux), aber wir können sie trotzdem verwenden \x. Sie können die entsprechenden Codes hier finden oder ein Tool verwenden hexedit, um sie zu erhalten.

Für irgendetwas in unserem oben genannten Interessensbereich wurde e9 be a5"Ungültiges Sortierzeichen" zurückgegeben, also habe ich mir Folgendes ausgedacht:

grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
dset0x
quelle
+1 Das funktioniert auch, aber Pablo war ein bisschen schneller ...
Nicolas Raoul
3
Das ist gleichbedeutend mit grep "[一-龥]". Das Problem ist, dass es vom Gebietsschema abhängt und Kollatierungsregeln verwendet. Das heißt, nur Elemente, für die eine Sortierreihenfolge definiert ist, können im Bereich verwendet oder abgeglichen werden. Der -PSwitch führt unabhängig vom Gebietsschema nur einen binären Abgleich durch. Ein auf dem Gebietsschema basierender Ansatz verwendet eine kulturelle Definition des "Zeichenbereichs", ein auf dem Binärformat basierender Ansatz verwendet eine Codierungswertdefinition des "Bereichs". Besonders bei alphabetischen Skripten ist die Ausgabe sehr unterschiedlich. (hier für Han-Ideogramme ist es in etwa gleichwertig)
Pablo Saratxaga