【问题标题】:Hex String Replacement Using sed使用 sed 替换十六进制字符串
【发布时间】:2011-12-07 07:47:45
【问题描述】:

我在 sed 查找/替换某些十六进制字符时遇到了一些麻烦。我想替换以下十六进制字符串文件中的所有实例:

0x0D4D5348

使用以下十六进制字符串:

0x0D0A4D5348

我该怎么做?

编辑:我正在尝试进行十六进制查找/替换。输入文件中没有“0x0D4D5348”的字面值,但它确实有它的 ASCII 表示。

【问题讨论】:

    标签: sed


    【解决方案1】:

    Howard Helman 的 GNU sed v3.02.80、GNU sed v1.03 和 HHsed v1.5 都支持符号\xNN,其中“NN”是两个有效的十六进制数字,00-FF。

    以下是如何替换二进制文件中的 HEX 序列:

    $ sed 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x53\x48/g' file > temp; rm file; mv temp file
    

    正如@sputnik 所指出的,您可以使用 sed 的 in place 功能。不过需要注意的是,如果您在 OS/X 上使用它,则必须添加一组空引号:

    $ sed '' 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x53\x48/g' file
    

    作为 OS/X takes a parameter 上的 sed in place 来指示在进行备份时要添加到文件名的扩展名,因为它确实首先创建了一个临时文件。但是然后.. OS/X 的 sed doesn't support \x.

    【讨论】:

    • 感谢您的彻底回应,但我想我不太清楚。我想基本上用 0x0D0A 替换行尾 0x0D,但是我只想替换下一行开头包含字符“MSH”(十六进制为 0x4D5348)的行尾。这更有意义吗?
    • 最好编辑您的原始信息,而不是期望其他读者阅读所有 cmets,寻找您修改后的规范。祝你好运!
    • 感谢您的提示。问题已修改。
    • 添加了关于二进制值的注释
    • 由于 OS X 中的 sed 不支持 \x,是否有其他方法可以在 OS X 中使用?
    【解决方案2】:

    这在 Linux 和 OSX 上对我有用。

    就地更换:

    sed -i '.bk' 's'/`printf "\x03"`'/foo/g' index.html
    

    (请参阅@tolitius 回答中@Ernest 的评论)

    【讨论】:

    • 古代是一个相对术语...这对我有帮助,谢谢。
    【解决方案3】:

    在 OS/X 系统的 Bash 中,你可以使用如下命令:

    # this command will crate a variable named a which contains '\r\n' in it
    a=`echo -e "hello\r\nworld\r\nthe third line\r\n"`
    
    echo "$a" | sed $'s/\r//g' | od -c
    
    

    现在你可以看到输出字符了:

    0000000    h   e   l   l   o  \n   w   o   r   l   d  \n   t   h   e
    0000020    t   h   i   r   d       l   i   n   e  \n
    0000033
    

    您应该注意到's/\r//g'$'s/\r//g' 之间的区别。 根据以上做法,可以使用这样的命令来替换十六进制字符串

    echo "$a" | sed $'s/\x0d//g'  | od -c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-12
      • 2018-06-06
      • 2018-03-05
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 2018-01-31
      • 2013-08-08
      相关资源
      最近更新 更多