当我在我的系统(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
不再需要了。
谢谢!
答案 0 :(得分:1)
使用bash
和dd
:
#!/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