Reverse match in sed, substitua o oposto do que foi encontrado

4

Digamos que eu tenha esta saída do meu syslog,

precalculated src_hash => 20 bytes @ 0x7f811c001e20
A6 2D E5 CD 2A BA F0 42 56 66 19 D4 61 1A E3 A0  .-..*..BVf..a...
C7 5E 5F 77                                      .^_w
precalculated dst_hash => 20 bytes @ 0x7f811c0020d0
15 EC 34 59 89 0F 4F F8 C5 68 3A DC BB 09 27 91  ..4Y..O..h:...'.
5D C1 E7 28                                      ]..(

Meu objetivo é retirar o lixo ASCII à direita e ficar com apenas os bytes hexadecimais do hash, enquanto ainda salvando as linhas começando com os nomes das variáveis. A expressão regular que estou usando é

(^([a-zA-Z_]+\s+)+[=]{1}) | (^([a-zA-Z0-9]{2}[\s]{1})+)

Que corresponde corretamente a uma linha que começa com um nome de variável ou uma cadeia hexadecimal que contém seu valor. Existe alguma maneira que eu poderia inverter o que é combinado de sed para retirar tipo de "o outro" material no fluxo? Pode ser canalizado para um arquivo de alguma forma?

    
por Q Q 21.07.2014 / 22:32

3 respostas

1

sed -e '/^precalculated/!s/^\(.\{47\}\).*$//' < h

Isso mantém os primeiros 47 caracteres em qualquer linha que não corresponda a precalculated no começo. As correspondências de linhas são copiadas.

    
por 21.07.2014 / 23:48
0

Eu encontrei este padrão:

sed  -e 's/^\(..\s.\{45\}\).*//'
    
por 21.07.2014 / 23:16
0

Você pode combinar qualquer seqüência inicial de pares de dígitos hexagonais em um grupo de substituição e, em seguida, apenas substituí-lo novamente, por exemplo,

sed -r 's/^(([[:xdigit:]]{2}\s+)+).*$//'
    
por 21.07.2014 / 23:50