我有一个很大的纯文本文件,其中包含各种语言,例如英语,日语,中文...我想获取包含汉字的行数。
我认为可以使用grep和wc -l来完成,但是我实际上该怎么做?
cat filename | grep -P "[\x{4e00}-\x{9fcc}]" | wc -l
此命令不起作用,并显示以下错误消息:
。grep:\ x {...}序列中的字符值太大。
[如果您不介意使用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
由于您指定了-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)中。
我有一个很大的纯文本文件,其中包含各种语言,例如英文,日文,中文...我想知道行数包含汉字。
我认为可以使用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