Risposte:
È impossibile (senza usare un grande tavolo) distinguere un kanji giapponese da un ideogramma Han non usato in giapponese (ad esempio, una variante cinese o coreana).
Se si desidera rilevare qualsiasi ideogramma Han nell'intervallo di base (da \ u4e00 a \ u9fff), vengono codificati in 3 byte, il primo byte è sempre compreso tra 0xe4 e 0xe9, il secondo e il terzo byte tra 0x80 e 0xbf.
Ci sono due difficoltà qui, prima devi dire a grep che vuoi occuparti dei byte e non dei caratteri; quindi devi digitare i byte 0xe4, 0xe9, 0x80 e 0xbf per inserirli nell'espressione regexp.
Ho scoperto che l'opzione -P fa entrambe le cose; e la linea che vuoi è:
grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]"
e se vuoi anche kana:
grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]|\xe3[\x81-\x83][\x80-\xbf]"
Secondo il quinto tavolo qui , i kanji sono i personaggi tra \u4e00
e\u9fff
La mia implementazione di grep
non sembra essere in grado di gestire caratteri unicode (che è GNU grep 2.14 su Archlinux), ma possiamo ancora usare \x
. Puoi trovare i rispettivi codici qui o utilizzare uno strumento come hexedit
per ottenerli.
Per qualsiasi cosa nella nostra gamma di interessi di cui sopra e9 be a5
restituito "Carattere di confronto non valido" quindi questo è quello che ho inventato:
grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
grep "[一-龥]"
. il problema è che dipende dalle impostazioni locali e utilizza le regole di confronto; vale a dire, solo gli elementi per i quali è definito un ordinamento possono essere utilizzati nell'intervallo o abbinati. L' -P
opzione esegue solo la corrispondenza binaria, indipendentemente dalle impostazioni internazionali. Un approccio basato su locale utilizzerà una definizione culturale di "intervallo di caratteri", un approccio basato su binario utilizzerà una definizione del valore di codifica di "intervallo". In particolare per gli script alfabetici l'output è piuttosto diverso. (qui per l'ideografia Han è approssimativamente equivalente)