grep: Temukan semua baris yang berisi kanji Jepang

14

Dalam file teks UTF-8 yang besar, saya ingin menampilkan semua baris yang berisi kanji Jepang .
Apa grep(atau lainnya) ekspresi yang melakukan ini?

Jika saya tidak salah, kanji adalah karakter antara \u4e00dan \u4dbf.

Saya tidak perlu menunjukkan kanas , tetapi menunjukkannya juga tidak akan menjadi masalah besar.

Nicolas Raoul
sumber

Jawaban:

12

Tidak mungkin (tanpa menggunakan meja besar) untuk membedakan kanji Jepang dari ideograf Han yang tidak digunakan dalam bahasa Jepang (misalnya, varian Cina atau Korea).

Jika Anda hanya ingin mendeteksi ideograf Han apa pun dalam rentang dasar (\ u4e00 hingga \ u9fff) maka mereka disandikan dalam 3 byte, byte pertama selalu antara 0xe4 dan 0xe9, byte kedua dan ketiga antara 0x80 dan 0xbf.

Ada dua kesulitan di sini, pertama Anda harus memberi tahu grep bahwa Anda ingin menjaga byte dan bukan karakter; maka Anda harus mengetik byte 0xe4, 0xe9, 0x80 dan 0xbf untuk menempatkannya dalam ekspresi regexp.

Saya menemukan saklar -P melakukan keduanya; dan garis yang Anda inginkan adalah:

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

dan jika Anda ingin kana juga:

grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]|\xe3[\x81-\x83][\x80-\xbf]"
Pablo Saratxaga
sumber
Itu bagus sekali!
Nicolas Raoul
4

Menurut tabel kelima di sini , kanji adalah karakter antara \u4e00dan\u9fff

Implementasi saya greptampaknya tidak dapat menangani karakter unicode (itu GNU grep 2.14 di Archlinux), tetapi kita masih bisa menggunakan \x. Anda dapat menemukan kode masing-masing di sini atau menggunakan alat suka hexeditmendapatkannya.

Untuk apa pun dalam rentang minat kami di atas, e9 be a5dikembalikan "Karakter susunan tidak valid" jadi inilah yang saya buat:

grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
dset0x
sumber
+1 Itu bekerja juga, tapi Pablo sedikit lebih cepat ...
Nicolas Raoul
3
Itu setara dengan grep "[一-龥]". masalahnya adalah itu tergantung pada lokal, dan menggunakan aturan pemeriksaan; yaitu, hanya elemen yang urutan penyortirannya dapat digunakan dalam kisaran atau cocok. The -Psaklar hanya melakukan pencocokan biner, terlepas dari lokal. Pendekatan berbasis lokal akan menggunakan definisi budaya "rentang karakter", pendekatan berbasis biner akan menggunakan definisi nilai pengkodean "rentang". Khusus untuk skrip alfabet, hasilnya sangat berbeda. (di sini untuk ideografi Han kira-kira setara)
Pablo Saratxaga