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

Posted

技术标签:

【中文标题】使用 sed 替换十六进制字符串【英文标题】:Hex String Replacement Using sed 【发布时间】:2011-12-07 07:47:45 【问题描述】:

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

0x0D4D5348

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

0x0D0A4D5348

我该怎么做?

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

【问题讨论】:

【参考方案1】:

Howard Helman 的 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/X takes a parameter 上的 sed in place 来指示在进行备份时要添加到文件名的扩展名,因为它确实首先创建了一个临时文件。但是然后.. OS/X 的 sed doesn't support \x.

【讨论】:

感谢您的彻底回应,但我想我不太清楚。我想基本上用 0x0D0A 替换行尾 0x0D,但是我只想替换下一行开头包含字符“MSH”(十六进制为 0x4D5348)的行尾。这更有意义吗? 最好编辑您的原始信息,而不是期望其他读者阅读所有 cmets,寻找您修改后的规范。祝你好运! 感谢您的提示。问题已修改。 添加了关于二进制值的注释 由于 OS X 中的 sed 不支持 \x,是否有其他方法可以在 OS X 中使用?【参考方案2】:

这在 Linux 和 OSX 上对我有用。

就地更换:

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

(请参阅@tolitius 回答中@Ernest 的评论)

【讨论】:

古代是一个相对术语...这对我有帮助,谢谢。【参考方案3】:

在 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

【讨论】:

以上是关于使用 sed 替换十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 z/OS UNIX 文件中替换十六进制字符

二进制 sed 替换

unix下KSH中shell的SED命令怎样把文件中的NULL替换成空格。 (十六进制码00替换成20)

用十六进制值替换字符串中的`{}`

如何在 Notepad++ 中替换十六进制级别的字符?

学习笔记第二十六节课