一部のコンテンツを削除したい大きなファイルがあり、ファイルはバイナリであり、行番号はありませんが、16 進アドレスがあるため、
0x13e70a00 と 0x1eaec03ffの間の領域を削除するにはどうすればよいですか
sed (両方を含む) )
このようなものは機能しますか?
sed -n 's/\x13e70a00/,s/\x1eaec03ff/ p' orig-data-file > new-file
あなたが書いたものから、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 進エディタを使用することです。