2011-04-18 18 views
3

執行某些命令我看起來像這樣的文件:SED - 無法在UTF-8編碼字符

<text top="123" left="45" width="50" height="17" font="8">Måndag</text> 

爲題所提到的,這個文件是UTF-8編碼。當使用這個命令時:

cat file | sed 's_.*top="\([0-9][0-9]*\)" left="\([0-9][0-9]*\)".*>\(.*\)<.*_\1 \2 \3_' 

它永遠不會完成執行並且什麼都不打印。

但是執行這樣一行一個:

cat file | sed 's/å/FOO/' 

給我一個正確的輸出:

<text top="123" left="45" width="50" height="17" font="8">MFOOndag</text> 

這是一個錯誤的SED還是有我的正則表達式或方式什麼事是我正在使用它?我想要的是一種簡潔的方式來提取頂部,左側和內容數據,而不涉及太多的命令。

+0

如果'sed'沒有在該命令上完成,無論輸入如何,它看起來像一個錯誤。你在運行什麼操作系統(名稱,分發版本)?如果你運行' Gilles 2011-04-18 22:23:35

+0

我正在使用最新版本的OS X(10.6.6)。不知道如何檢查bash中的語言環境,但'echo $ LANG'會給出'sv_SE.UTF-8'。我可能不得不學習另一種語言,比如進一步下去的tchrist所建議的perl語言。到那時,我會用一個醜陋的解決方案解決這個問題。 – Shump 2011-04-18 23:07:00

+0

'od -t x1 file'的輸出: '0000000 3c 74 65 78 74 20 74 6f 70 3d 22 31 32 33 22 20 0000020 6c 65 66 74 3d 22 34 35 22 20 77 69 64 74 68 3d 3d 0000040 22 35 30 22 20 68 65 69 67 68 74 3d 22 31 37 22 0000060 20 66 6f 6e 74 3d 22 38 22 3e 4d c3 a5 6e 64 61 0000100 67 3c 2f 74 65 78 74 3e 0a 0000111' – Shump 2011-04-18 23:07:44

回答

2

可靠地做到這一點,最簡單的方法就是用perl代替sed的:

bash$ perl -CSAD -pe 's/foo/bar/g' 

這將允許使用Unicode在你的論點,你STD流和所有文件您處理。

+0

如上所述,這個問題似乎是OSX的sed實現中的一個錯誤。對此的「好」解決方案似乎是學習諸如perl之類的替代語言。 – Shump 2011-04-18 23:13:06

1

並非所有的seds都可以處理UTF-8。我會查看源代碼以查看是否應用了任何相關的修補程序。 FTR,Red Hat派生的seds 正確處理UTF-8。

0

嘗試this建議。看起來它可以爲你工作。

+0

[請不要只發佈一個鏈接作爲問題的答案。總結參考鏈接的內容。](http://meta.stackexchange.com/q/8259)無論如何,輸入現在已被確認爲UTF-8。 – Gilles 2011-04-18 23:09:08