grep: Encontre todas as linhas que contenham kanjis japoneses

14

Em um enorme arquivo de texto UTF-8, quero mostrar todas as linhas que contêm kanjis em japonês. . Que grep (ou outra) expressão faz isso?

Se não me engano, os kanjis são os caracteres entre \u4e00 e \u4dbf .

Eu não preciso mostrar kanas , mas exibi-los também não seria um grande problema.

    
por Nicolas Raoul 22.02.2013 / 08:30

2 respostas

12

É impossível (sem usar uma mesa enorme) separar um kanji japonês de um ideograma han não usado em japonês (por exemplo, uma variante chinesa ou coreana).

Se você quiser apenas detectar qualquer ideograma Han no intervalo básico (\ u4e00 a \ u9fff) então eles são codificados em 3 bytes, o primeiro byte é sempre entre 0xe4 e 0xe9, o segundo e terceiro bytes entre 0x80 e 0xbf.

Existem duas dificuldades aqui, primeiro você tem que dizer ao grep que você quer cuidar dos bytes e não dos caracteres; então você tem que digitar os 0xe4, 0xe9, 0x80 e 0xbf bytes para colocá-los na expressão regexp.

Eu descobri que o switch -P faz as duas coisas; e a linha que você quer é:

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

e se você quiser kana também:

grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]|\xe3[\x81-\x83][\x80-\xbf]"
    
por 22.02.2013 / 10:40
4

De acordo com a quinta tabela aqui , os kanji são os caracteres entre \u4e00 e \u9fff

Minha implementação de grep parece não ser capaz de manipular caracteres unicode (isto é, o GNU grep 2.14 no Archlinux), mas ainda podemos usar \x . Você pode encontrar os respectivos códigos aqui ou usar uma ferramenta como hexedit para obtê-los.

Para qualquer coisa na nossa faixa de interesse acima de e9 be a5 retornou "caractere de agrupamento inválido", é isso que eu criei:

grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
    
por 22.02.2013 / 10:49

Tags