2013-07-29 105 views
2

我有一個很大的文件,我想從中刪除一些內容,該文件是二進制的,我沒有行號,但十六進制地址,所以我如何刪除區域間:
0x13e70a00和0x1eaec03ff
隨着SED(包括兩端)使用十六進制位置從文件中刪除行

威爾這樣的事情,工作的?

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

可能重複://堆棧overflow.com/questions/9451890/how-to-dump-part-of-binary-file) – Sebastian

+0

@塞巴斯蒂安我找不到那一個,但據我所知,那是關於讓內容到別的地方,我想要的是從文件中刪除它(並獲得沒有該區域的文件) – doterobcn

回答

2

您應該能夠使用的converting bash numbers from hex to decimalbash math巧妙地結合到1添加到小數點偏移,並以cut --complement -b從文件中刪除正確的段。

編輯:像這樣:

$ snip_out 0x0f 0x10 <<< "abcdeffedcba" | 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是兩個參數shell腳本,關於stdin和stdout操作:

#!/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 
+0

聽起來很有趣,但我不知道如何實現這個... – doterobcn

+1

@downvoter:我會很感激評論,以幫助我改善這個和其他職位。 –

+0

謝謝,我馬上檢查一下,但是文件非常大(55GB),所以可能需要一段時間。我還發現用dd可以從我的文件中提取n個字節,知道我做的位置,我應該能夠計算出我需要的字節....我也會嘗試! – doterobcn

2

從你寫的那樣子你試圖刪除兩個十六進制模式之間的所有字節。爲此,您將需要

這會刪除包含模式的模式之間的所有字節。

sed 's/\x13\xe7\x0a\x00.*\x1e\xae\xc0\x3f//g' in >out 

這將刪除模式留下圖案完好無損之間的所有字節。 (有一種方法將它與正則表達式的編號的部分,但是這是一個有點清晰一起beging)

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整個文件/g

如果你想從字節300刪除(或替換)到字節310:

sed 's/\(.\{300\}\).\{10\}/\1rep-str/' in>out 

這匹配前300個字符(.\{300\})並記住它們(\(\))。它也匹配接下來的10個字符。它取代了這個整體與第300個字符(\1),其次是你的替換字符串rep-str組合匹配這個替換字符串可以爲空只是刪除字節300和310

然而之間的文本,這是很脆,如果有任何換行符。如果你能活着,無需更換:

dd if=file bs=1 skip=310|dd of=file bs=1 seek=300 conv=notrunc 

這樣做的到位代之以從第310字節複製起直到到300位置開始的文件從而刪除10個字節

一個更普遍的選擇是

dd if=in bs=1 count=300>out 
printf "replacement text">>out 
dd if=in bs=1 skip=310>>out 

雖然做最簡單的事情將要使用十六進制編輯器,如祝福[如何轉儲二進制文件的一部分(HTTP的