grep: Trouver toutes les lignes contenant des kanjis japonais


14

Dans un énorme fichier texte UTF-8, je veux montrer toutes les lignes qui contiennent des kanjis japonais .
Quelle grep(ou autre) expression cela fait-il?

Si je ne me trompe pas, les kanjis sont les caractères entre \u4e00et \u4dbf.

Je n'ai pas besoin de montrer des kanas , mais les montrer ne serait pas non plus un gros problème.

Réponses:


12

Il est impossible (sans utiliser une immense table) de distinguer un kanji japonais d'un idéogramme Han non utilisé en japonais (par exemple, une variante chinoise ou coréenne).

Si vous souhaitez simplement détecter tout idéogramme Han dans la plage de base (\ u4e00 à \ u9fff), ils sont codés en 3 octets, le premier octet est toujours compris entre 0xe4 et 0xe9, les deuxième et troisième octets entre 0x80 et 0xbf.

Il y a deux difficultés ici, vous devez d'abord dire à grep que vous voulez prendre soin des octets et non des caractères; alors vous devez taper les octets 0xe4, 0xe9, 0x80 et 0xbf pour les mettre dans l'expression d'expression régulière.

J'ai découvert que le commutateur -P fait les deux; et la ligne que vous voulez est:

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

et si vous voulez aussi du kana:

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

Cela fonctionne très bien!
Nicolas Raoul

4

Selon le cinquième tableau ici , les kanji sont les caractères entre \u4e00et\u9fff

Mon implémentation de grepne semble pas être capable de gérer les caractères unicode (c'est GNU grep 2.14 sur Archlinux), mais nous pouvons toujours l'utiliser \x. Vous pouvez trouver les codes respectifs ici ou utiliser un outil comme hexeditpour les obtenir.

Pour tout ce qui est dans notre domaine d'intérêt ci-dessus, nous avons e9 be a5renvoyé un "caractère de classement non valide", voici donc ce que j'ai trouvé:

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

+1 Ça marche aussi, mais Pablo était un peu plus rapide ...
Nicolas Raoul

3
C'est équivalent à grep "[一-龥]". le problème est qu'il dépend des paramètres régionaux et utilise des règles de classement; c'est-à-dire que seuls les éléments pour lesquels un ordre de tri est défini peuvent être utilisés dans la plage ou mis en correspondance. Le -Pcommutateur ne fait que la correspondance binaire, indépendamment des paramètres régionaux. Une approche basée sur les paramètres régionaux utilisera une définition culturelle de "plage de caractères", une approche basée sur les binaires utilisera une définition de valeur de codage de "plage". En particulier pour les scripts alphabétiques, la sortie est assez différente. (ici pour l'idéographie Han c'est à peu près équivalent)
Pablo Saratxaga
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.