回答:
日本語の漢字を、日本語で使用されていない漢字(中国語や韓国語の異体字など)と区別することは(巨大なテーブルを使用しない限り)不可能です。
基本範囲(\ 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]"
第五表によると、ここで漢字、caractersの間にある\u4e00
と\u9fff
の私の実装でgrep
は、Unicode文字(ArchlinuxのGNU grep 2.14)を処理できないようですが、まだ使用できます\x
。ここでそれぞれのコードを見つけるか、ツールを使用しhexedit
て取得することができます。
上記の興味のある範囲でe9 be a5
「無効な照合文字」が返されたため、これが私が思いついたものです:
grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
grep "[一-龥]"
です。問題はロケール依存であり、照合規則を使用することです。つまり、並べ替え順序が定義されている要素のみが範囲内で使用されるか一致します。-P
スイッチは、ちょうどロケールにかかわらず、バイナリ照合を行います。ロケールベースのアプローチは「文字範囲」の文化的定義を使用し、バイナリベースのアプローチは「範囲」のエンコーディング値定義を使用します。特にアルファベットのスクリプトの場合、出力はまったく異なります。(漢字の場合、これはほぼ同等です)