Ответы:
Невозможно (без использования огромного стола) отличить японское кандзи от хан-иероглифа, не используемого в японском языке (например, китайский или корейский вариант).
Если вы просто хотите обнаружить любую идеографию Хана в базовом диапазоне (от \ 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]"
В соответствии с пятым столом здесь , кандзи являются caracters между \u4e00
и\u9fff
Моя реализация grep
, похоже, не в состоянии обрабатывать символы Юникода (это GNU grep 2.14 в Archlinux), но мы все еще можем использовать \x
. Вы можете найти соответствующие коды здесь или использовать инструмент, как hexedit
получить их.
Для всего, что находится в нашем диапазоне интересов, e9 be a5
возвращается «Неверный символ сортировки», поэтому я пришел к такому выводу:
grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
grep "[一-龥]"
. проблема в том, что он зависит от локали и использует правила сопоставления; то есть только элементы, для которых определен порядок сортировки, могут использоваться в диапазоне или совпадать. -P
Переключатель просто делает двоичное соответствие, независимо от языка. Подход, основанный на локали, будет использовать культурное определение «диапазона символов», а подход, основанный на двоичном коде, будет использовать определение значения кодирования «диапазона». В частности, для алфавитных скриптов вывод совсем другой. (здесь для идеографии Хана это примерно эквивалентно)