2016-08-09 12 views
1

Ich versuche, anfügen X Bytes nach Y Bytes in einer Binärdatei mit bash.SED: Anhängen zusätzlicher Bytes nach einer bestimmten Byte-Position

den Code unten verwenden scheint gut zu funktionieren, aber es scheitert (eine Verschiebung ist), wenn xFF

Beispiel begegnen: 1 Byte (Xaa) nach 907 Bytes

sed -r -i 's/^.{907}/&"\xaa"/' file.txt 

Ausgabe anhängen (wenn ok):

cat file.txt | od -t x1 -t c -Ad 

OK output

Ausgang (wenn nicht ok) :

sed -r -i 's/^.{907}/&"\xaa"/' file_2.txt 
cat file_2.txt | od -t x1 -t c -Ad 

NOT ok - Shift in the output

Jede Idee, warum dies geschieht und wenn es Alternativen für die SED sind verwendet?

+2

'sed' speziell mit Textdatei eingegeben wird, nicht binär verwendet. – Kusalananda

Antwort

3

Es ist keine gute Idee, binäre Stream mit sed, meiner Meinung nach zu bearbeiten. Normalerweise konvertieren Sie den binären Stream in einem Hex-Dump, bearbeiten Sie es und konvertieren Sie es zurück.

wie folgt aus:

$ hexdump -ve '1/1 "%.2X"' file1 \ 
| sed -r 's/^.{1814}/&aa/' \ 
| xxd -r -p > file2 

Sie können auch Perl anstelle von xxd:

| perl -e 'print pack "H*", <STDIN>' 
+0

+1, 'sed' dient zur Textbearbeitung. Sie könnten 'xxd' auch für die Binär-> Ascii-Umwandlung verwenden, z. B .:' xxd -p file1 | tr -d '\ n'' – Thor

+0

Gibt es eine xxd Alternative, um zurück zu konvertieren? Scheint, dass es nicht auf unserem redhat Server installiert ist. Auf meiner VM funktioniert es ohne Probleme und liefert die benötigte Ausgabe! +1 – Danjel

+0

@Danjel: Ja. Perl. Siehe mein Update –

0

Wie an anderer Stelle erwähnt sed unterstützt nur Textdateien. Ich denke, das bequemste Werkzeug für den Job ist bbe (Binary Block Editor), die sehr ähnlich zu sed aber auf Binärdaten funktioniert.

Sie beginnen mit der Definition des Blocks, den Sie bearbeiten möchten, mit dem -b Schalter, -b 907:1 in Ihrem Fall, weitere Informationen finden Sie auf den Seiten 3 und 4 unter the manual. Jetzt sagen Sie bbe welche Befehle auf dem Block mit dem -e Schalter zu laufen, A \xaa in Ihrem Fall, siehe Seite 5-8 in the manual für weitere Befehle.

Zusammengenommen:

bbe -b 907:1 -e 'A \xaa' file.txt > modified_file.txt 

Ein weiteres Beispiel der gesamte Datei als Block mit:

ist
bbe -e 'i 907 \xaa' file.txt > modified_file.txt 
+0

Versucht es heute und bestätigen, dass es auch funktioniert. Danke noch einmal. – Danjel

+0

@Danjel: Wenn Ihre Frage gelöst ist, denken Sie daran, [die beste Antwort zu akzeptieren] (http://stackoverflow.com/help/someone-answers). – Thor

Verwandte Themen