2013-03-24 35 views
0

我有一個非常大的純文本文件,包括各種語言,如英語,日語,中文......我想要得到包含中文字符的行數。如何獲取包含中文字符的行數?

我認爲這可以使用grep和wc -l來完成,但我怎麼能夠真正做到這個工作?

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

此命令不起作用,並有此錯誤消息:

.grep:在\ X {...}序列太大字符值。

+0

你使用了什麼樣的grep('grep -V')? – nwellnhof 2013-03-24 16:49:19

+0

你不必陷入GREP。你可以使用'grep -opt'模式「文件名」。我知道,不是超級有用。但一個調整。 – FrankieTheKneeMan 2013-03-24 20:24:00

回答

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引起的(PCRE_UTF8未設置對於UTF-8語言環境)已在this commit中修復。目前還沒有正式版本,但它應該包含在下一個版本中(2.15)。

相關問題