如何解决Linux SED 替换文件中的十六进制而不是插入? \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 插入相同的代码..如何避免它?我只需要用 08 更改 2A。提前致谢:)
更新
现在我一直在使用 \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
请记住,\1
\2
等和 &
在替换部件中也是特殊的。阅读 Escape a string for a sed replace pattern - 但您需要转义 \xXX
序列而不是每个字符(或首先将字符转换为实际字节,为什么要使用所有 \xXX
序列?)。或者选择其他工具。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。