Replace 为什么可以';是否替换二进制文件中的0x24字节?

Replace 为什么可以';是否替换二进制文件中的0x24字节?,replace,sed,binary,hex,binaryfiles,Replace,Sed,Binary,Hex,Binaryfiles,我想把二进制文件中的一些字节替换成另一个字节。 通过创建示例(6字节长)文件 然后尝试通过sed将字节\x15\x42\x02替换为\x12\x12\x02: sed 's \x15\x42\x02 \x12\x12\x02 g' test > test1 sed替换字节: cat test test1 | xxd -c 6 0000000: 8f15 4202 24c2 ..B.$. 0000006: 8f12 1202 24c2 ....$. ^^ ^^^^

我想把二进制文件中的一些字节替换成另一个字节。 通过创建示例(6字节长)文件

然后尝试通过sed将字节\x15\x42\x02替换为\x12\x12\x02

sed 's \x15\x42\x02 \x12\x12\x02 g' test > test1
sed替换字节:

cat test test1 | xxd -c 6
0000000: 8f15 4202 24c2  ..B.$.
0000006: 8f12 1202 24c2  ....$.
           ^^ ^^^^
cat test test2 | xxd -c 6
0000000: 8f15 4202 24c2  ..B.$.
0000006: 8f15 4202 24c2  ..B.$.
              ^^^^ ^^
尝试然后将字节\x42\x02\x24替换为\x12\x02\x24

sed 's \x42\x02\x24 \x12\x02\x24 g' test > test2
sed未替换字节:

cat test test1 | xxd -c 6
0000000: 8f15 4202 24c2  ..B.$.
0000006: 8f12 1202 24c2  ....$.
           ^^ ^^^^
cat test test2 | xxd -c 6
0000000: 8f15 4202 24c2  ..B.$.
0000006: 8f15 4202 24c2  ..B.$.
              ^^^^ ^^
怎么了?我有sed(GNU sed)4.2.2(Kubuntu 13.10)


谢谢。

sed声明如下所示

sed 's/\x15\x42\x02/\x12\x12\x02/g' test > test1
[root@localhost ~]# cat test test1 | xxd -c 6       
0000000: 8f15 4202 24c2  ..B.$.
0000006: 8f12 1202 24c2  ....$.
它们应该在搜索模式和应该替换它的模式之间

结果如下所示

sed 's/\x15\x42\x02/\x12\x12\x02/g' test > test1
[root@localhost ~]# cat test test1 | xxd -c 6       
0000000: 8f15 4202 24c2  ..B.$.
0000006: 8f12 1202 24c2  ....$.
你可以试试这个

hexdump -ve '1/1 "%.2X"' file1 | sed 's/420224/121224/g' | xxd -r -p > new_updated
测试:

sat:~# xxd -c 6  file1
0000000: 8f15 4202 24c2  ..B.$.
sat:~# hexdump -ve '1/1 "%.2X"' file1 | sed 's/420224/121224/g' | xxd -r -p > new_updated
sat:~# xxd -c 6 new_updated
0000000: 8f15 1212 24c2  ....$.

这是因为
0x24
$
字符的十六进制代码。请注意,
^
$
在regex中有特殊含义(sed
sed
用于匹配),字面意思分别是“在行首”和“在行尾”。因此,除非转义,否则将忽略这些字符。所以,

echo“this and that”| sed's/this$/cat/”

将保持字符串不变,因为您告诉sed在行尾查找'this',因为'that'在行尾,所以它不匹配。但是,

echo“它的价格是50.00美元。”| sed's/\$50\.00/47.00瑞士法郎/”

将按预期更改行,因为已转义
$
。对于二进制数据,只需在regex部分中的
\
字符(
\x5c
)的前面添加十六进制代码,就可以了


干杯。

它使用witn space作为命令/regex分隔符工作/就像witn space一样-仍在替换\x15\x42\x02,但没有替换\x42\x02\x24。它可以工作,但您需要通过8而不是6来检查并确认“s/\x42\x02\x24/\x12\x02\x24/g”测试>测试4;md5sum测试4 d1c66101d794687bf5d61b5ae4b7da03测试d1c66101d794687bf5d61b5ae4b7da03测试4-运气不好,xxd只是为了可视化更改您使用的操作系统是什么?我使用的是Kubuntu 13.10 AMD64,MD5/bin/sed之和是081C50C87D36BD90DADF4DF9483CACD。谢谢,但我很感兴趣,为什么sed可以替换一个字节序列,而不能替换文件中明确显示的另一个字节序列。没有错的地方-我会直接将粘贴的字节从echo命令复制到sed命令。我想知道这是否是因为\x24是
$
,这是一个正则表达式特殊字符(行锚),并且序列
\x42\x02
不会出现在行的末尾我已经尝试过它,使用不同长度的各种替换,我认为Glenn是对的。不管怎样,
sed
并不适用于二进制替换。您将遇到多字节字符等问题。最好使用某种“
sed
二进制文件”