2008-09-15 29 views
15

GNU sed版本4.1.5似乎與國際字符失敗。這裏是我的輸入文件:爲什麼sed無法使用國際字符以及如何修復?

Gras Och Stenar Trad - 從Moja到Minneapolis DVD [G2007DVD] 7812 | X
Gras Och Stenar Trad - 從Möja到Minneapolis DVD [G2007DVD] 7812 | Ÿ

(注意在第二行中的變音。)

當我做

SED的/.* | //'< in

我期望看到只有X和Y,因爲我要求刪除所有字符直到'|'和超越它的空間。相反,我得到:

X
Gras Och Stenar Trad - From M? Y

我知道我可以用tr去掉國際字符。首先,但有沒有辦法使用sed?

+0

這個問題似乎已經用GNU sed解決了(在版本4.2.2上測試過)。 – sorontar 2016-11-23 22:36:15

回答

24

我認爲,如果該文件的輸入編碼是從環境的首選編碼不同的錯誤發生。

例子:in是UTF-8

$ LANG=de_DE.UTF-8 sed 's/.*| //' < in 
X 
Y 
$ LANG=de_DE.iso88591 sed 's/.*| //' < in 
X 
Y 

UTF-8可以安全地被解釋爲ISO-8859-1,你會得到奇怪的字符但除此之外,一切都很好。

示例:in是ISO-8859-1

$ LANG=de_DE.UTF-8 sed 's/.*| //' < in 
X 
Gras Och Stenar Trad - From MöY 
$ LANG=de_DE.iso88591 sed 's/.*| //' < in 
X 
Y 

ISO-8859-1不能被解釋爲UTF-8,解碼輸入文件失敗。奇怪的匹配可能是由於sed試圖恢復而不是完全失敗的事實。

答案基於Debian Lenny/Sid和sed 4.1.5。

+0

這也適用,並允許我使用sed。謝謝! – Dave 2008-09-16 20:46:48

9

sed對於非ASCII文本的設置不是很好。然而,你可以在perl使用(幾乎)相同的代碼,並得到結果,你想:

perl -pe 's/.*\| //' x 
+0

這個提示非常有用。 – 2016-03-18 18:23:59

相關問題