grep: encontre todas as linhas que contêm kanjis japoneses

14

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

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

Não preciso mostrar kanas , mas mostrá-los também não seria um grande problema.

Nicolas Raoul
fonte

Respostas:

12

É impossível (sem usar uma mesa enorme) diferenciar um kanji japonês de um ideógrafo Han não usado em japonês (por exemplo, uma variante chinesa ou coreana).

Se você quiser detectar algum ideógrafo Han no intervalo básico (\ u4e00 a \ u9fff), eles serão codificados em 3 bytes, o primeiro byte sempre estará entre 0xe4 e 0xe9, o segundo e o terceiro bytes entre 0x80 e 0xbf.

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

Descobri que a opção -P faz as duas coisas; e a linha que você deseja é:

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]"
Pablo Saratxaga
fonte
Isso funciona muito bem!
Nicolas Raoul
4

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

Minha implementação de grepnão parece capaz de lidar com caracteres unicode (que é o GNU grep 2.14 no Archlinux), mas ainda podemos usá-lo \x. Você pode encontrar os respectivos códigos aqui ou usar uma ferramenta hexeditpara obtê-los.

Para qualquer coisa em nosso intervalo de interesse acima e9 be a5retornado "Caractere de agrupamento inválido", é isso que eu criei:

grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
dset0x
fonte
+1 Isso funciona também, mas Pablo foi um pouco mais rápido ...
Nicolas Raoul
3
Isso é equivalente a grep "[一-龥]". o problema é que depende do local e usa regras de agrupamento; isto é, apenas os elementos para os quais uma ordem de classificação é definida podem ser usados ​​no intervalo ou correspondidos. O -Pcomutador apenas faz a correspondência binária, independentemente da localidade. Uma abordagem baseada em localidade usará uma definição cultural de "intervalo de caracteres", uma abordagem baseada em binário usará uma definição de valor de codificação de "intervalo". Particularmente para scripts alfabéticos, a saída é bem diferente. (daqui para ideographics Han é aproximadamente equivalente)
Pablo Saratxaga