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


14

巨大なUTF-8テキストファイルで、日本語の漢字を含むすべての行を表示したいと思います。
これはどのようなgrep(または他の)表現ですか?

私は間違っていないよ場合は、漢字は間の文字である\u4e00\u4dbf

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

回答:


12

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

基本範囲(\ 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]"

それはうまくいきます!
ニコラスラウル

4

第五表によると、ここで漢字、caractersの間にある\u4e00\u9fff

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

上記の興味のある範囲でe9 be a5「無効な照合文字」が返されたため、これが私が思いついたものです:

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

あまりにも動作しますが、パブロは...少し速かった1
ニコララウル

3
それはと同等grep "[一-龥]"です。問題はロケール依存であり、照合規則を使用することです。つまり、並べ替え順序が定義されている要素のみが範囲内で使用されるか一致します。-Pスイッチは、ちょうどロケールにかかわらず、バイナリ照合を行います。ロケールベースのアプローチは「文字範囲」の文化的定義を使用し、バイナリベースのアプローチは「範囲」のエンコーディング値定義を使用します。特にアルファベットのスクリプトの場合、出力はまったく異なります。(漢字の場合、これはほぼ同等です)
パブロサラチャガ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.