Respostas:
É 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]"
De acordo com a quinta tabela aqui , kanji são os caracteres entre \u4e00
e\u9fff
Minha implementação de grep
nã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 hexedit
para obtê-los.
Para qualquer coisa em nosso intervalo de interesse acima e9 be a5
retornado "Caractere de agrupamento inválido", é isso que eu criei:
grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
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 -P
comutador 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)