2011-10-13 206 views
17

我在查找/替換一些十六進制字符時遇到了一些麻煩。我想下面的十六進制字符串的文件內更換所有實例:使用sed替換十六進制字符串

0x0D4D5348 

與以下十六進制字符串:

0x0D0A4D5348 

我怎麼能這樣做?

編輯:我試圖做一個十六進制查找/替換。輸入文件中沒有「0x0D4D5348」的文字值,但它具有ASCII碼錶示。

回答

26

GNU的sed v3.02.80,GNU sed的V1.03,和霍華德赫爾曼 HHsed V1.5都支持符號\xNN,其中 「NN」 是兩個有效的十六進制數字,00-FF。

這裏是如何在你的二進制文件替換HEX序列:

$ sed 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x53\x48/g' file > temp; rm file; mv temp file 

由於@sputnik指出的那樣,你可以用sed的in place功能。一個警告不過,如果你使用它在OS/X,你就必須添加一組空引號:

$ sed '' 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x53\x48/g' file 

作爲OS的sed in place/X takes a parameter指示要添加到文件名的擴展名是什麼當進行備份時,由於它確實是先創建一個臨時文件。但是然後.. OS/X的seddoesn't support\x

+0

我欣賞的徹底反應,但我想我是不太清楚。我想基本上用0x0D0A替換行結尾0x0D,但是我只想替換下一行開頭包含字符「MSH」(十六進制中的0x4D5348)的行尾。這是否更有意義? – Carter

+0

編輯原始信息比期望其他讀者閱讀所有評論更好,希望找到修訂的規範。祝你好運! – shellter

+0

感謝您的提示。問題修改。 – Carter

2

這適用於Linux和OSX上的我。

更換就地:

sed -i '.bk' 's'/`printf "\x03"`'/foo/g' index.html 

(見@在回答通過@tolitius歐內斯特的評論)

+1

古代是一個相對術語......這幫了我很多謝謝。 – ojblass

相關問題