如何获得包含中文字符的行数?

时间:2013-03-24 16:24:39

标签: regex bash unicode grep cjk

我有一个非常大的纯文本文件,包含各种语言,例如英语,日语,中文...我想得到包含中文字符的行数。

我认为这可以使用grep和wc -l完成,但我怎样才能真正完成这项工作呢?

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

此命令不起作用,并显示以下错误消息:

.grep:\ x {...}序列中的字符值太大。

3 个答案:

答案 0 :(得分: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字符表here。每种语言的某些特定表格在同一网站上提供。

一旦你定义了你想要捕捉的角色范围,剩下的就很容易了:

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

答案 1 :(得分:1)

由于您指定了-P选项,因此您可能正在使用GNU grep。错误消息似乎来自PCRE,Perl兼容的正则表达式库。所以您的PCRE版本与Perl不兼容,或者 GNU grep不使用PCRE的Unicode功能。

我只是尝试直接运行Perl:

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

编辑:我今天可以在Linux系统上对此进行测试,我发现它可能是由this bug in grep引起的(PCRE_UTF8未设置为UTF-8语言环境)固定在this commit。尚未正式发布修复程序,但它应该包含在下一个版本中(2.15)。

答案 2 :(得分:0)

我有一个很大的纯文本文件,其中包含各种语言,例如 英文,日文,中文...我想知道行数 包含汉字。

我认为可以使用grep和wc -l来完成此操作,但实际上我怎么能 做这份工作吗?

D:

此命令不起作用。

Grep本身不支持Unicode字符范围。只需使用grep变体(例如ugrep)即可完全支持Unicode和UTF-8 / 16/32编码输入:

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