Câu trả lời:
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]"
Theo bảng thứ năm ở đây , kanji là nhân vật giữa \u4e00
và\u9fff
Việc triển khai của grep
tô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 a5
trả 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
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 -P
tắ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)