【问题标题】: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' 似乎在工作:)

【问题讨论】:

    标签: sed replace hex


    【解决方案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 - 你呢?并阅读stackoverflow.com/questions/407523/… - 是吗?
    猜你喜欢
    • 2019-03-02
    • 2014-12-12
    • 2017-09-08
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 2016-02-13
    • 2016-05-01
    • 1970-01-01
    相关资源
    最近更新 更多