grep: Tìm tất cả các dòng có chứa kanjis Nhật Bản


14

Trong một tệp văn bản UTF-8 khổng lồ, tôi muốn hiển thị tất cả các dòng có chứa kanjis Nhật Bản .
Những gì grep(hoặc khác) biểu hiện này?

Nếu tôi không nhầm, kanjis là nhân vật giữa \u4e00\u4dbf.

Tôi không cần cho xem chuối , nhưng cho thấy chúng cũng không phải là vấn đề lớn.

Câu trả lời:


12

Không thể (không sử dụng một cái bàn lớn) để phân biệt một chữ Hán trong một chữ tượng hình Hán không được sử dụng trong tiếng Nhật (ví dụ: một biến thể của Trung Quốc hoặc Hàn Quốc).

Nếu bạn chỉ muốn phát hiện bất kỳ chữ tượng hình Han nào trong phạm vi cơ bản (\ u4e00 đến \ u9fff) thì chúng được mã hóa thành 3 byte, byte đầu tiên luôn nằm trong khoảng từ 0xe4 đến 0xe9, byte thứ hai và thứ ba nằm trong khoảng từ 0x80 đến 0xbf.

Có hai khó khăn ở đây, đầu tiên bạn phải nói với grep bạn muốn chăm sóc byte và không phải ký tự; sau đó bạn phải nhập các byte 0xe4, 0xe9, 0x80 và 0xbf để đặt chúng trong biểu thức regrec.

Tôi phát hiện ra công tắc -P làm cả hai; và dòng bạn muốn là:

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

và nếu bạn cũng muốn kana:

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

Điều đó làm việc tuyệt vời!
Nicolas Raoul

4

Theo bảng thứ năm ở đây , kanji là nhân vật giữa \u4e00\u9fff

Việc triển khai của greptôi dường như không thể xử lý các ký tự unicode (đó là GNU grep 2.14 trên Archlinux), nhưng chúng tôi vẫn có thể sử dụng \x. Bạn có thể tìm thấy các mã tương ứng ở đây hoặc sử dụng một công cụ như hexeditđể có được chúng.

Đối với bất kỳ điều gì trong phạm vi quan tâm của chúng tôi ở trên đều e9 be a5trả về "Nhân vật đối chiếu không hợp lệ", vì vậy đây là những gì tôi nghĩ ra:

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

+1 Điều đó cũng hoạt động, nhưng Pablo đã nhanh hơn một chút ...
Nicolas Raoul

3
Điều đó tương đương với grep "[一-龥]". vấn đề là nó phụ thuộc vào miền địa phương và sử dụng các quy tắc đối chiếu; nghĩa là, chỉ các phần tử mà một thứ tự sắp xếp được xác định có thể được sử dụng trong phạm vi hoặc khớp. Công -Ptắc chỉ thực hiện khớp nhị phân, bất kể miền địa phương. Cách tiếp cận dựa trên miền địa phương sẽ sử dụng định nghĩa văn hóa về "phạm vi ký tự", cách tiếp cận dựa trên nhị phân sẽ sử dụng định nghĩa giá trị mã hóa của "phạm vi". Riêng đối với các kịch bản chữ cái thì đầu ra khá khác nhau. (ở đây đối với chữ Hán, nó gần tương đương)
Pablo Saratxaga
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.