How do I trim bytes from the beginning and end of a file?
You can combine GNU tail
and head
:
tail -c +26 file | head -c -2
will output the contents of file
starting at byte 26, and stopping two bytes (minus two -2
) before the end. (-c
operates on bytes, not characters.)
dd will do both for you in a single command. Set the block size to 1 byte, skip the 25 first bytes, count to the size of file minus skip and end bytes.
100 byte file
file.img
dd if=./file.img of=./trimed_file.img bs=1 skip=25 count=73
Double check numbers cause it might count from 0.
With ksh93:
{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25))
Or to do it in-place:
{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25)) 1<>; file
If you have /opt/ast/bin
ahead of your $PATH
, you'll get the head
builtin.
<#((...))
is alseek()
operator....
is interpreted as an arithmetic expression whereEOF
is the length of the file. So above, we're assigning the length of the portion to display to$n
and seeking to 25 bytes within the file.<>;
is a open-in-read+write-mode-and-truncate-if-the-command-is-successful redirection operator.