web-dev-qa-db-ja.com

grep:日本語の漢字を含むすべての行を検索します

巨大なUTF-8テキストファイルで、日本語 kanjis を含むすべての行を表示したい。
これは何のgrep(または他の)式ですか?

誤解しない限り、漢字は\u4e00および\u4dbf

kanas を表示する必要はありませんが、表示することは大きな問題ではありません。

14
Nicolas Raoul

日本語の漢字と日本語で使用されていない漢字(たとえば、中国語や韓国語の変種)を区別することは(巨大なテーブルを使用しない限り)不可能です。

基本的な範囲(\ u4e00から\ u9fff)の漢字表意文字を検出したい場合、それらは3バイトでエンコードされ、最初のバイトは常に0xe4から0xe9の間、2番目と3番目のバイトは0x80から0xbfの間です。

ここには2つの困難があります。最初に、文字ではなくバイトの世話をしたいことをgrepに伝える必要があります。次に、0xe4、0xe9、0x80、および0xbfバイトを入力して、それらを正規表現式に入れる必要があります。

-Pスイッチが両方を実行することを発見しました。そしてあなたが望む行は:

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

仮名も必要な場合:

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

5番目の表 here によると、漢字は\u4e00\u9fffの間の文字です

私のgrepの実装では、Unicode文字(GNU grep 2.14 on Archlinux))を処理できないようですが、\xを使用できます。それぞれのコード here を見つけるか、hexeditのようなツールを使用してそれらを取得できます。

e9 be a5以上の関心のある範囲では、「無効な照合文字」が返されたので、これが私が思いついたものです。

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