我有一個很大的文件,我想從中刪除一些內容,該文件是二進制的,我沒有行號,但十六進制地址,所以我如何刪除區域間:
0x13e70a00和0x1eaec03ff
隨着SED(包括兩端)使用十六進制位置從文件中刪除行
威爾這樣的事情,工作的?
sed -n 's/\x13e70a00/,s/\x1eaec03ff/ p' orig-data-file > new-file
我有一個很大的文件,我想從中刪除一些內容,該文件是二進制的,我沒有行號,但十六進制地址,所以我如何刪除區域間:
0x13e70a00和0x1eaec03ff
隨着SED(包括兩端)使用十六進制位置從文件中刪除行
威爾這樣的事情,工作的?
sed -n 's/\x13e70a00/,s/\x1eaec03ff/ p' orig-data-file > new-file
您應該能夠使用的converting bash numbers from hex to decimal,bash 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
從你寫的那樣子你試圖刪除兩個十六進制模式之間的所有字節。爲此,您將需要
這會刪除包含模式的模式之間的所有字節。
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的
可能重複://堆棧overflow.com/questions/9451890/how-to-dump-part-of-binary-file) – Sebastian
@塞巴斯蒂安我找不到那一個,但據我所知,那是關於讓內容到別的地方,我想要的是從文件中刪除它(並獲得沒有該區域的文件) – doterobcn