sed 可以修改二进制文件?

这是 LFS 上看到的一个命令( http://www.linuxfromscratch.org/lfs/view/stable/chapter06/…
关注者
28
被浏览
24,751

8 个回答

sed是流编辑器, 既可以是字符流也可以是二进制流,可以针对文本字符或二进制字符进行修改替换,可以直接修改二进制文件。感谢

multiple1902

提醒。

$ sed 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x53\x48/g' binfile > new_binfile

我一般用sed以“迂回”方式修改二进制文件,直观些,不容易出错:

举一个非常典型实用的sed修改二进制文件的应用场景:

Oracle 10g的表导出dmp文件是一种二进制文件,经常需要在字符集“US7ASCII”和“ZHS16GBK”转换,需要将US7ASCII字符集dmp文件的“0001”字符集特征码改为ZHS16GBK字符集dmp文件的“0354”字符集特征码,以下命令就可以用sed修改转换:

$ hexdump -ve '1/1 "%.2x"' ora10g_mytab_us7ascii.dmp | sed "s/0001000107d00001/0001035407d00001/" |xxd -r -p > ora10g_mytab_zhs16gbk.dmp

hexdump命令的作用是:将二进制文件转换为文本dump文件

sed命令的作用是:将特征码修改替换

xxd命令的作用是:将文本dump文件转换为二进制文件

通过hexdump、sed、xxd命令管道组合,可以修改任何二进制文件,你想怎么改就怎么改,怎么样,威力大吗?尤其是多个的二进制文件大批量修改,效率极高,不需要另编处理程序,也不需要使用低效的二进制文件编辑器。

sed乍一看好像除了能替换字符其它啥也干不了,其实威力大着呢。大批量转换情况下,为提高性能,还可以直接修改二进制文件:

$ sed -i "s/\x00\x01\x00\x01\x07\xd0\x00\x01/\x00\x01\x03\x54\x07\xd0\x00\x01/" ora10g_mytab_us7ascii.dmp 

sed 这样可以替换`strings /usr/bin/updatedb ` 里的字符串。

按照文中的意思,似乎是为了修正 updatedb 里调用find 的路径。