使用sed替换十六进制字符串



我有一些麻烦习惯做一些十六进制字符的查找/替换。我想替换以下十六进制字符串文件中的所有实例:

0x0D4D5348

包含以下十六进制字符串:

0x0D0A4D5348

我该怎么做呢?

编辑:我正试图做一个十六进制查找/替换。输入文件中没有"0x0D4D5348"的文字值,但它确实有其中的ASCII表示形式。

GNU sed v3.02.80, GNU sed v1.03和HHsed v1.5由Howard Helman编写都支持符号xNN,其中"NN"是两个有效的十六进制数,00-FF。

下面是如何替换二进制文件中的HEX序列:
$ sed 's/x0Dx4Dx53x48/x0Dx0Ax4Dx53x48/g' file > temp; rm file; mv temp file

正如@sputnik指出的,您可以使用sed的in place功能。需要注意的是,如果你在OS/X上使用它,你必须添加一组空引号:

$ sed '' 's/x0Dx4Dx53x48/x0Dx0Ax4Dx53x48/g' file

OS/X上的sed in place使用一个参数来表示在进行备份时要向文件名添加什么扩展名,因为它会先创建一个临时文件。但后来. .OS/X的sed不支持x

这在Linux和OSX上对我有效。

取代就地:

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

(参见@Ernest在@tolitius的回答中的评论)

在OS/X系统的Bash中,你可以使用这样的命令:

# this command will crate a variable named a which contains 'rn' in it
a=`echo -e "hellornworldrnthe third linern"`
echo "$a" | sed $'s/r//g' | od -c

,现在你可以看到输出字符:

0000000    h   e   l   l   o  n   w   o   r   l   d  n   t   h   e
0000020    t   h   i   r   d       l   i   n   e  n
0000033

您应该注意到's/r//g'$'s/r//g'之间的区别。基于上述实践,您可以使用这样的命令来替换十六进制字符串

echo "$a" | sed $'s/x0d//g'  | od -c

最新更新