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

Car*_*ter 23 sed

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

0x0D4D5348
Run Code Online (Sandbox Code Playgroud)

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

0x0D0A4D5348
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑:我正在尝试做一个hex找到/替换.输入文件中没有文字值"0x0D4D5348",但它的ASCII表示形式.

tol*_*ius 30

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
Run Code Online (Sandbox Code Playgroud)

正如@sputnik指出的那样,你可以使用sed的in place功能.但有一点需要注意,如果你在OS/X上使用它,你必须添加一组空的引号:

$ sed '' 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x53\x48/g' file
Run Code Online (Sandbox Code Playgroud)

因为in placeOS/X上的sed 接受一个参数来指示在进行备份时要添加到文件名的扩展名,因为它确实首先 创建了一个临时文件.但那时...... OS/X sed 不支持 \x.

  • 由于OS X中的sed不支持\ x,是否有不同的方法可以在OS X中使用? (4认同)

And*_*w E 5

这对我在 Linux 和 OSX 上有效。

就地更换:

sed -i '.bk' 's'/`printf "\x03"`'/foo/g' index.html
Run Code Online (Sandbox Code Playgroud)

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

  • 古代是一个相对术语...这帮助了我谢谢。 (2认同)

fir*_*for 5

在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

Run Code Online (Sandbox Code Playgroud)

现在你可以看到输出字符:

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
Run Code Online (Sandbox Code Playgroud)

's/\r//g'您应该注意到和之间的区别$'s/\r//g'。根据上面的做法,可以使用这样的命令来替换hex String

echo "$a" | sed $'s/\x0d//g'  | od -c
Run Code Online (Sandbox Code Playgroud)