我在使用sed查找/替换某些十六进制字符时遇到了一些麻烦。我想替换以下十六进制字符串的文件中的所有实例:
0x0D4D5348
使用以下十六进制字符串:
0x0D0A4D5348
我该怎么做?
编辑:我正在尝试进行十六进制查找/替换。输入文件中没有文字值“0x0D4D5348”,但它的ASCII表示形式也是如此。答案 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