我有一个非常大的纯文本文件,包含各种语言,例如英语,日语,中文...我想得到包含中文字符的行数。
我认为这可以使用grep和wc -l完成,但我怎样才能真正完成这项工作呢?
cat filename | grep -P "[\x{4e00}-\x{9fcc}]" | wc -l
此命令不起作用,并显示以下错误消息:
.grep:\ x {...}序列中的字符值太大。
答案 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