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 字符表。每种语言的一些特定表格在同一网站上提供。

一旦你定义了你想要捕捉的字符范围,剩下的就很简单了:

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 回答
0

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

我认为这可以使用 grep 和 wc -l 来完成,但是我该如何实际完成这项工作呢?

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

该命令不起作用。

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

cat filename | ugrep "[\x{4e00}-\x{9fcc}]" | wc -l
于 2020-01-13T22:09:00.733 回答