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.
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?
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.
Eu encontrei este padrão:
sed -e 's/^\(..\s.\{45\}\).*//'
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+)+).*$//'
Tags grep sed regular-expression