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

Posted

技术标签:

【中文标题】Linux SED 在文件中替换 HEX 而不是插入? \\x2A【英文标题】:Linux SED replace HEX in file instead of insert? \x2ALinux SED 在文件中替换 HEX 而不是插入? \x2A 【发布时间】:2021-05-23 21:17:08 【问题描述】:

我有这些字节: 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' 似乎在工作:)

【问题讨论】:

【参考方案1】:

\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

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

【讨论】:

现在我坚持使用 \x26。 sed -e 's/\xDB/\x26/g' 此代码拒绝将 DB 替换为 26,但是当我运行 s/\xDB/\xFF 时它可以工作。有什么想法吗? Remember that \1 \2 etc. and &amp; are special in replacement part too - 你呢?并阅读***.com/questions/407523/… - 是吗?

以上是关于Linux SED 在文件中替换 HEX 而不是插入? \x2A的主要内容,如果未能解决你的问题,请参考以下文章

linux sed 替换

linux sed命令就是这么简单

(转)linux sed命令就是这么简单

转linux sed命令就是这么简单

[转帖]linux sed命令

sed命令在文件中替换、插入