UTF-16 編碼造成 sed 無法正常工作
昨天在使用 sed 替換一個文件中的內容時,發現 sed 無法正常工作。將文件上傳到虛擬機中,執行同樣的命令仍舊不能正常工作,一度讓我懷疑自己是不是把命令記錯了。
使用了非常簡單的刪除命令發現也不能正常工作,讓人有點無語。
這之後又用一個系統中的正常文件進行測試,發現 sed 可以正常工作,我感到非常的不解。
文件編碼的問題
搞了一會,使用 cat -A 查看了下文件的內容時,發現竟讓輸出了一堆亂碼,如下所示:
^@o^@l^@d^@_^@r^@e^@g^@ ^@i^@s^@2^@d^@4^@0^@c^@0^@0^@^M^@$
看到了這個輸出,我才反應過來應該是編碼的問題。執行 file 命令查看文件的編碼,發現竟然是 UTF-16。
相關的信息如下:
longyu@longyu-pc:/tmp$ file test.log
test.log: Little-endian UTF-16 Unicode text, with CRLF line terminators
iconv 編碼轉換
我使用 sed 替換的 test.log 文件的部分內容如下:
old_reg is 12940c00, ret is 12940c00
old_reg is 12d40c00, ret is 12d40c00
執行如下 iconv
命令轉換編碼爲 UTF-8。
longyu@longyu-pc:/tmp$ iconv -f UTF-16 -t UTF-8 ./test.log | file -
/dev/stdin: ASCII text, with CRLF line terminators
再次使用 sed 處理轉化過的文件,能夠正常工作。
UTF-16 的編碼文件怎麼來的
sed 不能處理 Unicode 的問題我是有所瞭解的,但是我卻忽略了文件的格式爲 UTF-16 的問題。
這個 test.log 是 xshell 中記錄的日誌文件,有必要記錄一下,免得以後踩相同的坑。