【发布时间】:2011-12-07 07:47:45
【问题描述】:
我在 sed 查找/替换某些十六进制字符时遇到了一些麻烦。我想替换以下十六进制字符串文件中的所有实例:
0x0D4D5348
使用以下十六进制字符串:
0x0D0A4D5348
我该怎么做?
编辑:我正在尝试进行十六进制查找/替换。输入文件中没有“0x0D4D5348”的字面值,但它确实有它的 ASCII 表示。
【问题讨论】:
标签: sed
我在 sed 查找/替换某些十六进制字符时遇到了一些麻烦。我想替换以下十六进制字符串文件中的所有实例:
0x0D4D5348
使用以下十六进制字符串:
0x0D0A4D5348
我该怎么做?
编辑:我正在尝试进行十六进制查找/替换。输入文件中没有“0x0D4D5348”的字面值,但它确实有它的 ASCII 表示。
【问题讨论】:
标签: sed
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.
【讨论】:
这在 Linux 和 OSX 上对我有用。
就地更换:
sed -i '.bk' 's'/`printf "\x03"`'/foo/g' index.html
(请参阅@tolitius 回答中@Ernest 的评论)
【讨论】:
在 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
【讨论】: