Linux SED 替换文件中的 HEX 而不是插入? \x2A

Linux SED replace HEX in file instead of insert? \x2A

我有这些字节: E6 2A 1B EF 11 00 00 00 00 00 00 4E 43 DB E8

我需要用这些替换它们: 64 08 1A EF 11 00 00 00 00 00 DA D8 26 04

当我开始实验时,我注意到一件奇怪的事情。

sed -e 's/\xE6/\x64/g'

此代码将第一个 E6 替换为 64 ok

然而,当我尝试更改更多字节 (2A) 时导致问题。

sed -e 's/\xE6\x2A/\x64\x08/g'

据我所知,2A 插入了相同的代码。如何避免?我只需要将 2A 更改为 08。提前致谢:)

已更新


现在我坚持使用 \x26。 sed -e 's/\xDB/\x26/g' 此代码拒绝将 DB 替换为 26,但是当我 运行 s/\xDB/\xFF 时它起作用了。有任何想法吗?这样26有问题。我试过[\x26],这里没有帮助。

好的。 s/\xDB/\&/g' 似乎有效:)

\x2a*,这在正则表达式中是特殊的:

$ sed 's/a*/b/' <<<'aaa'
b
$ sed 's/a\x2a/b/' <<<'aaa'
b

您可以在正则表达式中使用 括号表达式 来取消字符的特殊属性,但我发现它不适用于我的 GNU sed 的所有字符:

$ sed 's/\xE6[\x2A]/OK/' <<<$'I am \xE6\x2A'
I am OK
$ sed 's/[\xE6][\x2A]/OK/' <<<$'I am \xE6\x2A'
I am �*

那是因为 \xE6] 可能是一些无效的 UTF 字符。记得使用 C 语言环境:

$ LC_ALL=C sed 's/[\xE6][\x2A]/OK/' <<<$'I am \xE6\x2A'
I am OK

记住 </code> <code> 等和 & 在替换零件方面也很特殊。阅读 Escape a string for a sed replace pattern - 但您需要转义 \xXX 序列而不是每个字符(或者首先将字符转换为实际字节,为什么要使用所有 \xXX 序列?)。或者选择其他工具。