我有一个大文件,我想删除一些内容,文件是二进制文件,我没有行号,但是十六进制地址,所以如何删除之间的区域:
0x13e70a00和0x1eaec03ff
使用sed(包括两者)
这样的事情会起作用吗?
sed -n 's/\x13e70a00/,s/\x1eaec03ff/ p' orig-data-file > new-file
答案 0 :(得分:3)
这将删除模式之间的所有字节,包括模式。
sed 's/\x13\xe7\x0a\x00.*\x1e\xae\xc0\x3f//g' in >out
这将删除模式之间的所有字节,使模式保持不变。 (对于正则表达式的编号部分,有一种方法可以实现这一点,但这可能会更加清晰)
sed 's/\x13\xe7\x0a\x00.*\x1e\xae\xc0\x3f/\x13\xe7\x0a\x00\x1e\xae\xc0\x3f/g' in >out
他们在s/
搜索<pattern1>
后跟任意文字.*
,然后搜索<pattern2>
,并将其替换为任何//g
或仅替换为两条边{整个文件/<pattern1><pattern2>/g
如果要从字节300删除(或替换)到字节310:
/g
这匹配前300个字符(sed 's/\(.\{300\}\).\{10\}/\1rep-str/' in>out
)并记住它们(.\{300\}
)。它也匹配接下来的10个字符。它将整个组合匹配替换为前300个字符(\(\)
),后跟替换字符串\1
,此替换字符串可以为空,只删除字节300和310之间的文本。
但是,如果有任何换行符,这是非常脆弱的。如果你能活下去而不用替换:
rep-str
通过从第310个字节开始复制直到从300位开始的文件,从而删除10个字节,这样就可以实现替换
更常见的替代方案是
dd if=file bs=1 skip=310|dd of=file bs=1 seek=300 conv=notrunc
尽管最简单的事情是使用像Bless
这样的十六进制编辑器答案 1 :(得分:2)
您应该能够巧妙地将converting bash numbers from hex to decimal,bash math组合使用,将1添加到十进制偏移量,并使用cut --complement -b
从文件中删除正确的段。
编辑:像这样:
$ snip_out 0x0f 0x10 <<< "0123456789abcdeffedcba9876543210" | od -t x1
0000000 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 65
0000020 64 63 62 61 39 38 37 36 35 34 33 32 31 30
0000036
其中snip_out
是一个在stdin和stdout上运行的双参数shell脚本:
#!/bin/bash
START_RANGE_DEC=$(printf "%d" $1)
END_RANGE_DEC=$(printf "%d" $2)
# Most hex ranges begin with 0; cut begins with 1.
CUT_START_DEC=$(( $START_RANGE_DEC + 1 ))
CUT_END_DEC=$(( $END_RANGE_DEC + 1 ))
# cut likes to append a newline after output. Use head to remove it.
exec cut --complement -b $CUT_START_DEC-$CUT_END_DEC | head -c -1