grep: Знайдіть усі рядки, що містять японські канджі


14

У величезному текстовому файлі UTF-8 я хочу показати всі рядки, що містять японські канжі .
Який grep(чи інший) вираз це робить?

Якщо я не помиляюся, канджі є персонажами між \u4e00і \u4dbf.

Мені не потрібно показувати кана , але їх показ також не буде великою проблемою.

Відповіді:


12

Неможливо (без використання величезної таблиці) відокремити японські канджі від ідеографа Хань, що не використовується японською мовою (наприклад, китайський або корейський варіант).

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

Тут є дві складнощі, спочатку потрібно сказати grep, що хочете доглядати за байтами, а не символами; тоді вам слід набрати байти 0xe4, 0xe9, 0x80 та 0xbf, щоб помістити їх у вираз regexp.

Я виявив, що -P перемикач робить і те, і інше; і потрібна лінія:

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

і якщо ви хочете і кана:

grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]|\xe3[\x81-\x83][\x80-\xbf]"

Це чудово працює!
Nicolas Raoul

4

У відповідності з п'ятим столом тут , кандзі є caracters між \u4e00і\u9fff

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

Для всього, що є в нашому діапазоні інтересів, що e9 be a5повернувся вище, "Недійсний символ збірки", ось що я придумав:

grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt

+1 Це теж працює, але Пабло був трохи швидшим ...
Ніколас Рауль

3
Це еквівалентно grep "[一-龥]". проблема полягає в тому, що вона залежить від локальної локалізації та використовує правила зіставлення; тобто в діапазоні можуть бути використані лише елементи, для яких визначено порядок сортування. -PПеремикач просто робить двоичное відповідність, незалежно від мови. Локальний підхід використовує культурне визначення "діапазону символів", а двійковий підхід використовує визначення значення кодування "діапазон". Особливо для алфавітних сценаріїв вихід зовсім інший. (тут для ідеографії Хана це приблизно рівнозначно)
Пабло Саратхага
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.