如何获得包含汉字的行数?

问题描述 投票:0回答:3

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

我认为可以使用grep和wc -l来完成,但是我实际上该怎么做?

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

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

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

regex bash unicode grep cjk
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字符表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
投票

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

我只是尝试直接运行Perl:

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

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


0
投票

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

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

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

此命令无效。

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

cat filename | ugrep "[\x{4e00}-\x{9fcc}]" | wc -l
© www.soinside.com 2019 - 2024. All rights reserved.