使用 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 替换十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章