grep: Znajdź wszystkie wiersze zawierające japońskie kanjis

14

W ogromnym pliku tekstowym UTF-8 chcę pokazać wszystkie linie zawierające japońskie kanjis .
Jakie grep(lub inne) wyrażenie to robi?

Jeśli się nie mylę, kanjis to znaki między \u4e00a \u4dbf.

Nie muszę pokazywać kan , ale pokazanie ich również nie byłoby dużym problemem.

Nicolas Raoul
źródło

Odpowiedzi:

12

Niemożliwe jest (bez użycia ogromnego stołu) rozróżnienie japońskiego kanji od ideografu Han nie używanego w języku japońskim (np. Wariant chiński lub koreański).

Jeśli chcesz tylko wykryć dowolny ideograf Hana w zakresie podstawowym (\ u4e00 do \ u9fff), to są one zakodowane w 3 bajtach, pierwszy bajt zawsze zawiera się między 0xe4 a 0xe9, drugi i trzeci bajt między 0x80 a 0xbf.

Istnieją tutaj dwie trudności, najpierw musisz powiedzieć grepowi, że chcesz zajmować się bajtami, a nie znakami; następnie musisz wpisać bajty 0xe4, 0xe9, 0x80 i 0xbf, aby umieścić je w wyrażeniu regularnym.

Odkryłem, że przełącznik -P działa zarówno; a linia, którą chcesz to:

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

a jeśli chcesz też Kana:

grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]|\xe3[\x81-\x83][\x80-\xbf]"
Pablo Saratxaga
źródło
To działa świetnie!
Nicolas Raoul
4

Zgodnie z piątą tabelą tutaj kanji to znaki pomiędzy \u4e00i\u9fff

grepWydaje się, że moja implementacja nie jest w stanie obsłużyć znaków Unicode (to jest GNU grep 2.14 na Archlinuxie), ale nadal możemy jej używać \x. Możesz znaleźć odpowiednie kody tutaj lub użyć narzędzia takiego jak hexeditje zdobyć.

Dla wszystkiego, co znajduje się w naszym kręgu zainteresowań, powyżej e9 be a5zwróciłem „Niepoprawny znak zestawienia”, więc oto co wymyśliłem:

grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
dset0x
źródło
+1 To też działa, ale Pablo był nieco szybszy ...
Nicolas Raoul,
3
To jest równoważne z grep "[一-龥]". problem polega na tym, że jest on zależny od ustawień regionalnych i używa reguł sortowania; to znaczy, tylko elementy, dla których zdefiniowano porządek sortowania, mogą być użyte w zakresie lub dopasowane. -PPrzełącznik właśnie robi dopasowanie binarne, niezależnie od lokalizacji. Podejście lokalne wykorzystuje kulturową definicję „zakresu znaków”, podejście binarne wykorzystuje definicję wartości kodowania „zasięgu”. Szczególnie w przypadku skryptów alfabetycznych wyniki są zupełnie inne. (tutaj dla ideografii Hana jest to w przybliżeniu odpowiednik)
Pablo Saratxaga