Altera o intervalo de bytes por endereço no pipe

1

Eu tenho alguns dados binários que estão sendo transmitidos por meio de um pipeline básico. Os dados geralmente têm mais de 50 MB de tamanho.

O código existente parece mais ou menos assim

inputprocess | filter1 | filter2 | filter3 > result.txt

Eu sei que há valores inválidos nos 30000-30099 bytes após o primeiro filtro no fluxo. Eu sei quais devem ser os valores. Eu só preciso substituir os bytes ruins pelos bons. Não há mudanças no tamanho dos dados.

Se isso fosse baseado em linhas, usaria algo como:

inputprocess | filter1 | sed -e'SOMETHING' | filter2 | filter2 > result.txt

No entanto, não tenho certeza do que deve acontecer com sed ao trabalhar com dados do bindary.

    
por Michael Anderson 08.04.2014 / 06:46

2 respostas

2

sed é orientado à linha e não é um ajuste natural para problemas com dados binários. No entanto, head e tail funcionarão:

inputprocess | filter1  | { head -c29999 ; echo -n "replacement" ; tail -c+100 ; } | filter2 | filter3 > result.txt

head -c29999 echos os primeiros 29.999 bytes a stdout. Em seguida, o texto de substituição é enviado para stdout. Em seguida, tail -c+100 ignora os próximos 100 bytes de entrada (os que você deseja substituir) e copia o restante para stdout.

Isso funciona assumindo que head não lê mais do que precisa. Isso funciona sob o GNU head . Em sistemas não-Linux, no entanto, pode ser necessário verificar se o comando head é voraz.

    
por 08.04.2014 / 07:02
0

Se você quiser ir a rota sed (1), você pode querer adicionar hexdump (1) e xxd (1) ao pipe também:

$>echo Hello | hexdump -ve '1/1 "%.2X"' | sed 's/48656C6C6F/476F6F64627965/' | xxd -r -p
Goodbye
    
por 11.04.2014 / 19:29

Tags