【问题标题】:How can I get the number of lines containing Chinese characters?如何获取包含汉字的行数?
【发布时间】:2013-03-14 02:47:07
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你使用什么样的 grep (grep -V)?
  • 您不必进入 GREP。您可以使用grep -opt "pattern" filename。不是很有帮助,我知道。但稍作调整。

标签: regex bash unicode grep cjk


【解决方案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 名称。可以在here 找到一个 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

【讨论】:

    【解决方案2】:

    由于您指定了-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 引起的(PCRE_UTF8 不是为 UTF-8 语言环境设置的),它已在this commit。目前还没有正式版本的修复,但它应该包含在下一个版本(2.15)中。

    【讨论】:

      【解决方案3】:

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

      我认为这可以使用 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
      

      【讨论】:

        猜你喜欢
        • 2021-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多