grep: busca todas las líneas que contienen kanjis japoneses

14

En un gran archivo de texto UTF-8, quiero mostrar todas las líneas que contienen kanjis japoneses .
¿Qué grep(u otra) expresión hace esto?

Si no me equivoco, los kanjis son los caracteres entre \u4e00y \u4dbf.

No necesito mostrar kanas , pero mostrarlas también no sería un gran problema.

Nicolas Raoul
fuente

Respuestas:

12

Es imposible (sin usar una tabla enorme) distinguir un kanji japonés de un ideógrafo Han que no se usa en japonés (por ejemplo, una variante china o coreana).

Si solo desea detectar cualquier ideógrafo Han en el rango básico (\ u4e00 a \ u9fff), entonces están codificados en 3 bytes, el primer byte siempre está entre 0xe4 y 0xe9, el segundo y tercer bytes entre 0x80 y 0xbf.

Aquí hay dos dificultades: primero debe decirle a grep que desea cuidar los bytes y no los caracteres; luego debe escribir los bytes 0xe4, 0xe9, 0x80 y 0xbf para colocarlos en la expresión regexp.

Descubrí que el interruptor -P hace ambas cosas; y la línea que quieres es:

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

y si quieres kana también:

grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]|\xe3[\x81-\x83][\x80-\xbf]"
Pablo Saratxaga
fuente
Eso funciona muy bien!
Nicolas Raoul
4

Según la quinta tabla aquí , los kanji son los caracteres entre \u4e00y\u9fff

Mi implementación de grepno parece ser capaz de manejar caracteres Unicode (eso es GNU grep 2.14 en Archlinux), pero aún podemos usar \x. Puede encontrar los códigos respectivos aquí o utilizar una herramienta hexeditpara obtenerlos.

Para cualquier cosa en nuestro rango de interés anterior, se ha e9 be a5devuelto "Carácter de colación inválido", así que esto es lo que se me ocurrió:

grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
dset0x
fuente
+1 Eso también funciona, pero Pablo fue un poco más rápido ...
Nicolas Raoul
3
Eso es equivalente a grep "[一-龥]". el problema es que depende de la configuración regional y usa reglas de intercalación; es decir, solo los elementos para los que se define un orden de clasificación se pueden usar en el rango o coincidir. El -Pconmutador solo hace coincidencias binarias, independientemente de la configuración regional. Un enfoque basado en la configuración regional utilizará una definición cultural de "rango de caracteres", un enfoque basado en binarios usará una definición de valor de codificación de "rango". Particularmente para los scripts alfabéticos, la salida es bastante diferente. (aquí para la ideografía Han es aproximadamente equivalente)
Pablo Saratxaga