Cria linhas de quebra xxd

3

Para mostrar o conteúdo de um arquivo com dados binários de texto e formatados em outro post no SE, não consegui decidir qual será a exibição da saída renderizada ASCII ou a saída xxd .

Como meio termo, pensei em um hexdump que faz respeitar as novas linhas.

Exemplo de

(Outro):

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 0a61 7574 686f 7220  1e662491.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 636f  8126633 +0200.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 0a69 6e69 740a            +0200..init.

se tornaria

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:                       61 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:                                    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:                0a                              .

000000c0:                  69 6e69 740a                   init.

ou

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:                       61 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:                                    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:                0a                              .
000000c0:                  69 6e69 740a                   init.

ou

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.
                                61 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.
                                             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.
                         0a                              .
                           69 6e69 740a                   init.

ou similar

    
por stuquus 22.06.2017 / 13:38

1 resposta

2

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.

    
por 23.06.2017 / 01:43

Tags