grep: Найти все строки, содержащие японские кандзи

14

В огромном текстовом файле UTF-8 я хочу показать все строки, которые содержат японские кандзи .
Какое grep(или другое) выражение это делает?

Если я не ошибаюсь, кандзи - это символы между \u4e00и \u4dbf.

Мне не нужно показывать канас , но показ их тоже не будет большой проблемой.

Николас Рауль
источник

Ответы:

12

Невозможно (без использования огромного стола) отличить японское кандзи от хан-иероглифа, не используемого в японском языке (например, китайский или корейский вариант).

Если вы просто хотите обнаружить любую идеографию Хана в базовом диапазоне (от \ u4e00 до \ u9fff), тогда они кодируются в 3 байта, первый байт всегда между 0xe4 и 0xe9, второй и третий байты между 0x80 и 0xbf.

Здесь есть две трудности: во-первых, вы должны сказать grep, что хотите следить за байтами, а не за символами; затем необходимо ввести байты 0xe4, 0xe9, 0x80 и 0xbf, чтобы поместить их в выражение регулярного выражения.

Я обнаружил, что ключ -P делает оба; и строка, которую вы хотите:

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

и если вы хотите кана тоже:

grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]|\xe3[\x81-\x83][\x80-\xbf]"
Пабло Саратчага
источник
Это прекрасно работает!
Николас Рауль
4

В соответствии с пятым столом здесь , кандзи являются caracters между \u4e00и\u9fff

Моя реализация grep, похоже, не в состоянии обрабатывать символы Юникода (это GNU grep 2.14 в Archlinux), но мы все еще можем использовать \x. Вы можете найти соответствующие коды здесь или использовать инструмент, как hexeditполучить их.

Для всего, что находится в нашем диапазоне интересов, e9 be a5возвращается «Неверный символ сортировки», поэтому я пришел к такому выводу:

grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
dset0x
источник
+1 Это тоже работает, но Пабло был немного быстрее ...
Николас Рауль
3
Это эквивалентно grep "[一-龥]". проблема в том, что он зависит от локали и использует правила сопоставления; то есть только элементы, для которых определен порядок сортировки, могут использоваться в диапазоне или совпадать. -PПереключатель просто делает двоичное соответствие, независимо от языка. Подход, основанный на локали, будет использовать культурное определение «диапазона символов», а подход, основанный на двоичном коде, будет использовать определение значения кодирования «диапазона». В частности, для алфавитных скриптов вывод совсем другой. (здесь для идеографии Хана это примерно эквивалентно)
Пабло Саратчага