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

时间:2011-10-13 21:37:57

标签: sed

我在使用sed查找/替换某些十六进制字符时遇到了一些麻烦。我想替换以下十六进制字符串的文件中的所有实例:

0x0D4D5348

使用以下十六进制字符串:

0x0D0A4D5348

我该怎么做?

编辑:我正在尝试进行十六进制查找/替换。输入文件中没有文字值“0x0D4D5348”,但它的ASCII表示形式也是如此。

3 个答案:

答案 0 :(得分:29)

GNU sed v3.02.80,GNU sed v1.03和Howard Helman的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 / X takes a parameter上显示in place以指示在进行备份时要添加到文件名的扩展名,因为 首先创建临时文件。但是...... OS / X的sed doesn't support \x

答案 1 :(得分:3)

这适用于Linux和OSX。

原地取代:

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

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

答案 2 :(得分:2)

在OS / X系统的Bash中,您可以使用如下命令:

# this command will crate a variable named a which contains '\r\n' in it
a=`echo -e "hello\r\nworld\r\nthe third line\r\n"`

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