Não é exatamente o que você pede, mas é muito próximo.
Existem bytes nulos (de valor 0x00) no seu arquivo, o que torna as coisas mais complexas. Estou assumindo que esses bytes poderiam ser alterados para DELs (bytes de valor 0x7F) se esse valor de byte não existir na sua entrada.
Isso é feito com tr:
$ cat infile | tr '#!/bin/bash
while IFS=$'\n' read line; do
length=$((${#line}+1))
{
dd if=/dev/zero bs=1 count=$((position%16)) 2>/dev/null;
echo "$line";
} |
tr '7' '$ ./so
00000000: 636f 6d6d 6974 2031 3933 0074 7265 6520 commit 193.tree
00000010: 3331 3439 3530 3736 3263 6561 3232 3364 314950762cea223d
00000020: 3230 6233 3931 6235 3162 3336 3463 6134 20b391b51b364ca4
00000030: 3165 3636 3234 3931 0a 1e662491.
00000030: 0000 0000 0000 0000 0061 7574 686f 7220 .........author
00000040: 4578 616d 706c 6520 5573 6572 203c 6578 Example User <ex
00000050: 616d 706c 6575 7365 7240 7374 6163 6b6f ampleuser@stacko
00000060: 7665 7266 6c6f 772e 636f 6d3e 2031 3439 verflow.com> 149
00000070: 3831 3236 3633 3320 2b30 3230 300a 8126633 +0200.
00000070: 0000 0000 0000 0000 0000 0000 0000 636f ..............co
00000080: 6d6d 6974 7465 7220 4578 616d 706c 6520 mmitter Example
00000090: 5573 6572 203c 6578 616d 706c 6575 7365 User <exampleuse
000000a0: 7240 7374 6163 6b6f 7665 7266 6c6f 772e r@stackoverflow.
000000b0: 636f 6d3e 2031 3439 3831 3236 3633 3320 com> 1498126633
000000c0: 2b30 3230 300a +0200.
000000c0: 0000 0000 0000 0a .......
000000c0: 0000 0000 0000 0069 6e69 740a .......init.
' |
xxd -o "$((16*(position/16)))" -l "$((length+position%16))"
echo
(( position=position+length ))
done < <(cat infile | tr '$ cat infile | tr '#!/bin/bash
while IFS=$'\n' read line; do
length=$((${#line}+1))
{
dd if=/dev/zero bs=1 count=$((position%16)) 2>/dev/null;
echo "$line";
} |
tr '7' '$ ./so
00000000: 636f 6d6d 6974 2031 3933 0074 7265 6520 commit 193.tree
00000010: 3331 3439 3530 3736 3263 6561 3232 3364 314950762cea223d
00000020: 3230 6233 3931 6235 3162 3336 3463 6134 20b391b51b364ca4
00000030: 3165 3636 3234 3931 0a 1e662491.
00000030: 0000 0000 0000 0000 0061 7574 686f 7220 .........author
00000040: 4578 616d 706c 6520 5573 6572 203c 6578 Example User <ex
00000050: 616d 706c 6575 7365 7240 7374 6163 6b6f ampleuser@stacko
00000060: 7665 7266 6c6f 772e 636f 6d3e 2031 3439 verflow.com> 149
00000070: 3831 3236 3633 3320 2b30 3230 300a 8126633 +0200.
00000070: 0000 0000 0000 0000 0000 0000 0000 636f ..............co
00000080: 6d6d 6974 7465 7220 4578 616d 706c 6520 mmitter Example
00000090: 5573 6572 203c 6578 616d 706c 6575 7365 User <exampleuse
000000a0: 7240 7374 6163 6b6f 7665 7266 6c6f 772e r@stackoverflow.
000000b0: 636f 6d3e 2031 3439 3831 3236 3633 3320 com> 1498126633
000000c0: 2b30 3230 300a +0200.
000000c0: 0000 0000 0000 0a .......
000000c0: 0000 0000 0000 0069 6e69 740a .......init.
' |
xxd -o "$((16*(position/16)))" -l "$((length+position%16))"
echo
(( position=position+length ))
done < <(cat infile | tr '%pre%' '7')
' '7'
' '7')
' '7'
Após processar o arquivo com xxd, essa alteração pode ser recuperada.
Execute este script:
%pre%Para obter:
%pre%Não é exatamente o que você pediu (devido a muitos zeros adicionados), mas acredito que isso esteja próximo o suficiente para passar a ideia.
Se você quiser uma saída sem os zeros, mas a numeração da posição dos bytes não será um múltiplo de 16, peça o script.