Respuestas:
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]"
Según la quinta tabla aquí , los kanji son los caracteres entre \u4e00
y\u9fff
Mi implementación de grep
no 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 hexedit
para obtenerlos.
Para cualquier cosa en nuestro rango de interés anterior, se ha e9 be a5
devuelto "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
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 -P
conmutador 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)