Wie schneide ich Bytes vom Anfang und Ende einer Datei ab?

Wie schneide ich Bytes vom Anfang und Ende einer Datei ab?

Ich habe eine Datei, die am Anfang und Ende Müll (binäre Kopf- und Fußzeilen) enthält. Ich würde gerne wissen, wie ich diese Bytes löschen kann. Nehmen wir als Beispiel 25 Bytes vom Anfang an. Und 2 Bytes vom Ende.

Ich weiß, dass ich Truncate und DD verwenden kann, aber Truncate funktioniert nicht mit einem Stream und es scheint etwas umständlich, zwei Befehle auf der Festplatte auszuführen. Es wäre besser, wenn man truncate, da man weiß, wie groß die Datei ist, die Datei caten könnte dd. Oder wenn es eine bessere Möglichkeit gäbe, dies zu tun?

Antwort1

Sie können GNU kombinierentailUndhead:

tail -c +26 file | head -c -2

gibt den Inhalt aus, filebeginnend bei Byte 26 und endend zwei Bytes (minus zwei -2) vor dem Ende. ( -carbeitet mit Bytes, nicht mit Zeichen.)

Antwort2

dderledigt beides mit einem einzigen Befehl für Sie. Stellen Sie die Blockgröße auf 1 Byte ein, überspringen Sie die ersten 25 Bytes und zählen Sie bis zur Dateigröße abzüglich der übersprungenen und Endbytes.

100 byte file
file.img

dd if=./file.img of=./trimed_file.img bs=1 skip=25 count=73

Überprüfen Sie die Zahlen doppelt, da sie möglicherweise bei 0 beginnen.

Antwort3

Mit ksh93:

{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25))

Oder um es direkt vor Ort zu tun:

{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25)) 1<>; file

Wenn Sie /opt/ast/binvor Ihrem haben $PATH, erhalten Sie das headintegrierte.

  • <#((...))ist ein lseek()Operator. ...wird als arithmetischer Ausdruck interpretiert, wobei EOFdie Länge der Datei ist. Oben weisen wir also die Länge des anzuzeigenden Teils $n25 Bytes innerhalb der Datei zu und suchen danach.
  • <>;ist ein Umleitungsoperator zum Öffnen im Lese- und Schreibmodus und Abschneiden, wenn der Befehl erfolgreich ist.

verwandte Informationen