2010-08-08 46 views
2

在最近的question有人指出,在OSX上運行sed在非ascii文件上給出了奇怪的結果。例如,如果你這樣做(在/ usr/bin中/ CAL是一個隨機二進制文件)LANG和sed在OSX

sed 's/[^A-Z]//' /usr/bin/cal 

sed將刪除所有比A-Z以外的可打印字符,但很多非打印字符依然存在。但是,如果你做

LANG='' sed 's/[^A-Z]//' /usr/bin/cal 

只輸出A-Z(和換行符)。爲什麼?

正常LANG=en-US.UTF-8這是怎麼回事?反正我看不出sed的輸出可以在UTF-8中被認爲是正確的。它是破碎的,還是有一些我不明白的工作概念?

我知道OSX sed符合POSIX,因此與心愛的GNU sed不同。

回答

3

二進制數據(如/ usr/bin/cal的內容)不是UTF-8,因此會混淆讀取它的所有代碼。特別地,具有高位設置(例如,> = 128)的任何字節將被解釋爲表示單個字符的多字節序列的一部分,並且因此將從輸出中消除。並非所有高位字節的字節序列都是有效的UTF-8,所以事情會變得相當混亂,但這可能解釋了爲什麼一些不可打印的字符仍然存在,但可能不是其他字符。

簡而言之:如果您想在二進制數據上使用面向文本的工具,請不要。

相關問題