0

英語、日本語、中国語など、あらゆる種類の言語を含む非常に大きなプレーン テキスト ファイルがあります。漢字を含む行数を取得したいと考えています。

これは grep と wc -l を使用して実行できると思いますが、実際にこの作業を行うにはどうすればよいですか?

cat filename | grep -P "[\x{4e00}-\x{9fcc}]" | wc -l

このコマンドは機能せず、次のエラー メッセージが表示されます。

.grep: \x{...} シーケンスの文字値が大きすぎます。

4

3 に答える 3

1

Python を使用してもかまわない場合は、モジュールを使用して、ファイルで使用されている文字を確認できunicodedataます。nāgarī 入力と Python 3 の例:

>>> import unicodedata
>>> word = "ब्र॑ह्मन्"
>>> len(word)
9
>>> for char in word:
...     unicodedata.name(char)
... 
'DEVANAGARI LETTER BA'
'DEVANAGARI SIGN VIRAMA'
'DEVANAGARI LETTER RA'
'DEVANAGARI STRESS SIGN UDATTA'
'DEVANAGARI LETTER HA'
'DEVANAGARI SIGN VIRAMA'
'DEVANAGARI LETTER MA'
'DEVANAGARI LETTER NA'
'DEVANAGARI SIGN VIRAMA'

もちろん、最初に各スクリプトで使用されているグリフの Unicode 名を探す必要があります。Unicode 文字の表は、ここにあります。各言語のいくつかの特定の表は、同じ Web サイトで提供されています。

キャッチしたい文字の範囲を定義したら、あとはとても簡単です。

all_chars = ['ब', '्', 'र', '॑', 'ह', '्','म', 'न', '्']

i = 0
with open('thefile') as f:
    for line in f.readline():
        i += 1
        for char in all_chars:
            if char in line:
                print("char %s found in line %s" % (char, i))
                continue
于 2013-03-24T22:40:33.443 に答える
1

オプションを指定しているので-P、GNU grep を使用している可能性があります。エラー メッセージは、Perl 互換の正規表現ライブラリである PCRE から来ているようです。したがって、PCRE のバージョンが Perl と十分に互換性がないか、 GNU grep が PCRE の Unicode 機能を使用していないかのいずれかです。

Perl を直接実行してみます。

perl -ne 'print if /[\x{4e00}-\x{9fcc}]/' filename | wc -l

編集:今日、Linux システムでこれをテストできました。おそらく、このコミットで修正された grep のバグ(PCRE_UTF8 は UTF-8 ロケールに対して設定されていません) が原因であることがわかりました。修正された公式リリースはまだありませんが、次のリリース (2.15) に含まれる予定です。

于 2013-03-24T22:42:00.473 に答える