2012-11-14 65 views
13

我試圖從俄羅斯短篇小說中提取單詞列表。tr [:upper:] [:lower:]與西里爾文本

#!/bin/sh 

export LC_ALL=ru_RU.utf8 

sed -re 's/\s+/\n/g' | \ 
sed 's/[\.!,—()«»;:?]//g' | \ 
tr '[:upper:]' '[:lower:]' | \ 
sort | uniq 

但是,tr步驟不會降低西里爾文大寫字母。我以爲我正在聰明地使用便攜式角色課程!

$ LC_ALL=ru_RU.utf8 echo "Г" | tr [:upper:] [:lower:] 
Г 

如果相關,我通過從Chrome瀏覽器窗口複製粘貼到Vim中獲得俄文文本。它看起來正好在屏幕上(一個Putty終端)。這是在Cygwin的bash shell中 - 它應該與Linux上的Bash相同(應該!)。

什麼是便攜式,可靠的方式來管道中的小寫unicode文本?

+1

轉換與'sed'工作對我來說:'回聲 'СТЭК' | sed's/[[:upper:]] */\ L&/'' –

+1

'echo「Г」| tr [:upper:] [:lower:]'在Mac OS X 10.8系統上正確輸出「 - 」。 – ulidtko

+0

謝謝@LevLevitsky。這對我來說是一個合適的解決方案(隨意將其推廣到答案中)。我想知道爲什麼tr不起作用。 – slim

回答

9

這是我在Wikipedia發現(沒有任何參考,雖然):

大多數版本的tr,包括GNU tr和經典的Unix tr,運行在單字節字符,並且不支持Unicode標準。 Heirloom Toolchest實施例外,它提供了基本的Unicode支持。

此外,this是舊的,但有關。

正如我在評論中提到,sed似乎工作(GNU sed,至少):

$ echo 'СТЭК' | sed 's/[[:upper:]]*/\L&/' 
стэк 
+3

是的,單字節問題是真實的。我曾經把這個報告稱爲GNU的一個bug,並且他們解釋說這是由設計決定的(也就是說,爲了解決這個問題,它們必須破壞與舊軟件的兼容性)。我也在郵件列表上討論過它,並且同樣地[告訴它應該是這樣](http://lists.gnu.org/archive/html/bug-coreutils/2004-10/msg00063.html)。 –

+2

如果要替換所有出現的元素,請記住將g標誌添加到正則表達式中。 –

+0

GNU sed 4.4不再正確執行此操作。 :-( –