grep: trova tutte le righe che contengono kanjis giapponesi


14

In un enorme file di testo UTF-8, voglio mostrare tutte le righe che contengono kanjis giapponesi .
Quale grep(o altra) espressione fa questo?

Se non sbaglio, i kanjis sono i personaggi tra \u4e00e \u4dbf.

Non ho bisogno di mostrare i kana , ma anche mostrarli non sarebbe un grosso problema.

Risposte:


12

È 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]"

Funziona benissimo!
Nicolas Raoul,

4

Secondo il quinto tavolo qui , i kanji sono i personaggi tra \u4e00e\u9fff

La mia implementazione di grepnon 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 hexeditper ottenerli.

Per qualsiasi cosa nella nostra gamma di interessi di cui sopra e9 be a5restituito "Carattere di confronto non valido" quindi questo è quello che ho inventato:

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

+1 Funziona anche questo, ma Pablo è stato un po 'più veloce ...
Nicolas Raoul,

3
Questo equivale a 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' -Popzione 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)
Pablo Saratxaga,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.