我在查找某些十六进制字符的查找/替换时遇到了一些麻烦.我想替换以下十六进制字符串的文件中的所有实例:
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.
这对我在 Linux 和 OSX 上有效。
就地更换:
sed -i '.bk' 's'/`printf "\x03"`'/foo/g' index.html
Run Code Online (Sandbox Code Playgroud)
(请参阅@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
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)