使用Hex位置从文件中删除行

时间:2013-07-29 23:55:20

标签: linux bash sed

我有一个大文件,我想删除一些内容,文件是二进制文件,我没有行号,但是十六进制地址,所以如何删除之间的区域:
0x13e70a00和0x1eaec03ff
使用sed(包括两者)

这样的事情会起作用吗?

sed -n 's/\x13e70a00/,s/\x1eaec03ff/ p' orig-data-file > new-file

2 个答案:

答案 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

{1}}

如果要从字节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 decimalbash 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