我需要替代ghex

时间:2014-08-08 01:19:22

标签: regex sed command

当我在我的系统(Debian)中安装 Sublime Text 2 时,我需要使用ghex使用Edit-> Goto Byte查找地址0x590ADC。之后,我需要替换33的号码32。所有这些都是为了解决退格键的问题。

所以,我想知道在没有使用ghex的情况下是否还有其他方法可以做到这一点,我想使用命令行(也许是sed)这样做,因为我使用bashscript来安装我的所有系统,包括 Sublime Text 2 等软件。

Bellow,sed命令,替换所有33 42次出现并替换为32 42

sed 's/\x33\x42/\x32\x42/g' sublime_text

我需要类似上面的内容,但在特定地址中,42不再需要了。

谢谢!

3 个答案:

答案 0 :(得分:1)

使用bashdd

#!/bin/bash

function replace {
    [[ $# -eq 4 && -f $1 ]] || return 1
    local FILE=$1 ADDRESS=$2 EXPR=$3 LENGTH=$4
    local BLOCK_SIZE=512
    local BLOCKS=$(( ADDRESS / BLOCK_SIZE ))
    local REM=$(( ADDRESS - (BLOCKS * BLOCK_SIZE) ))
    {
        [[ BLOCKS -gt 0 ]] && dd bs="$BLOCK_SIZE" count="$BLOCKS" status=none
        [[ REM -gt 0 ]] && dd bs=1 count="$REM" status=none
        printf "$EXPR"
        dd bs=1 count="$LENGTH" of=/dev/null status=none
        dd bs="$BLOCK_SIZE" status=none
    } < "$FILE"
}

示例数据(hexdump -C格式):

00000000  00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f  |................|
00000010  10 11 12 13 14                                    |.....|

测试:

replace data.bin 10 '\xFF\xFF' 2

输出:

00000000  00 01 02 03 04 05 06 07  08 09 ff ff 0c 0d 0e 0f  |................|
00000010  10 11 12 13 14                                    |.....|

答案 1 :(得分:0)

此模式也匹配33和33 42     〜S / \ X33(\ X42)/?\ X32 $ 1 /克

答案 2 :(得分:0)

sed没有字节寻址,但使用标准工具很容易做到这一点。

( cut -b1-5835484 file; printf "%c" 50; cut -b5835486- file )>newfile

给定足够的唯一上下文,可以找到可能仅在文件中匹配一次的表达式(但在pessimal情况下,您需要整个文件作为上下文),这样您就可以做一些事情像

sed 's/\(\x01\xf3\x29\x02\)\x33\(\x42\x29\xea\x44)/\1\x32\2/' file >newfile

还有可编程的十六进制编辑器,允许您使用简单的sed类似语言进行字节寻址。或者,如果您有一个hexdump程序,它读取自己的输入以重建新文件,请执行类似

的操作
hexdump file |
sed 's/\(^0x0x590AD0 .. .. .. .. .. .. .. .. .. .. .. .. \)33/\132/' |
hexdump -v >newfile