2

一部のコンテンツを削除したい大きなファイルがあり、ファイルはバイナリであり、行番号はありませんが、16 進アドレスがあるため、
0x13e70a00 と 0x1eaec03ffの間の領域を削除するにはどうすればよいですか
sed (両方を含む) )

このようなものは機能しますか?

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

2 に答える 2

3

あなたが書いたものから、2 つの 16 進パターンの間のすべてのバイトを削除しようとしているように見えます。そのために必要になります

これにより、パターンを含むパターン間のすべてのバイトが削除されます。

 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/a の後に続く任意のテキストを検索し、<pattern1>ファイル全体で何もないか、2 つのエッジだけに置き換えます。.*<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

最も簡単なことは、Bless のような 16 進エディタを使用することです。

于 2013-07-30T09:49:29.107 に答える