grep: Japonca kanjis içeren tüm satırları bul


14

Büyük bir UTF-8 metin dosyasında, Japonca kanjis içeren tüm satırları göstermek istiyorum .
Bunu hangi grepifade (ya da diğer) yapıyor?

Eğer yanılmıyorsam, kanjiler \u4e00ve arasındaki karakterlerdir \u4dbf.

Kanas göstermek zorunda değilim , ama onlara da göstermek büyük bir sorun olmaz.

Yanıtlar:


12

Japonca kullanılmayan bir Han ideografisinden (örneğin, bir çince veya kore dili varyantı) bir Japon kanji ayırmak mümkün değildir (büyük bir tablo kullanmadan).

Sadece temel aralıktaki herhangi bir Han ideografını (\ u4e00 ila \ u9fff) tespit etmek istiyorsanız, bunlar 3 baytta kodlanır, ilk bayt her zaman 0xe4 ve 0xe9 arasındadır, ikinci ve üçüncü bayt 0x80 ve 0xbf arasındadır.

Burada iki zorluk var: önce grep'e karakterlere değil baytlara bakmak istediğinizi söylemelisiniz; regexp ifadesine koymak için 0xe4, 0xe9, 0x80 ve 0xbf baytlarını yazmanız gerekir.

-P anahtarının her ikisini de yaptığını keşfettim; ve istediğiniz çizgi:

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

ve siz de kana istiyorsanız:

grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]|\xe3[\x81-\x83][\x80-\xbf]"

Harika çalışıyor!
Nicolas Raoul

4

Beşinci tabloya göre Buradaki kanji, \u4e00ve\u9fff

Uygulamam, grepunicode karakterleri işleyemiyor gibi görünüyor (Archlinux'da GNU grep 2.14), ancak yine de kullanabiliriz\x . İlgili kodları burada bulabilir veya almak için bir araç kullanabilirsiniz hexedit.

Yukarıdaki ilgi alanımızdaki herhangi bir şey için e9 be a5"Geçersiz harmanlama karakteri" döndürdü, bu yüzden ben bu kadar geldim:

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

+1 Bu da işe yarıyor, ama Pablo biraz daha hızlıydı ...
Nicolas Raoul

3
Bu eşdeğerdir grep "[一-龥]". sorun, yerel ayara bağlı olması ve harmanlama kurallarını kullanması; yani, yalnızca bir sıralama düzeninin tanımlandığı öğeler aralıkta kullanılabilir veya eşleştirilebilir. -PAnahtar olursa olsun sadece yereli, ikili eşleştirme yapar. Yerel ayar tabanlı bir yaklaşım "karakter aralığı" nın kültürel tanımını, ikili tabanlı yaklaşım ise "aralık" kodlama değeri tanımını kullanır. Özellikle alfabetik betikler için çıktı oldukça farklıdır. (Han ideografileri için kabaca eşdeğerdir)
Pablo Saratxaga
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.