Com seus dados de exemplo e grep
com expressões regulares perl (PCRE) ativadas ( -P
):
grep -oP '\xFF\xD8.*\xFF\xD9' input >image.jpeg
O sinalizador -o
diz grep
para imprimir apenas a parte correspondente. O teste depois parece promissor:
$ file image.jpeg
image.jpeg: JPEG image data
Editar : se o acima não funcionar e tiver que ser sed
, temos que converter os dados em texto:
hexdump -ve '1/1 "%.2X"' input | sed 's/.*\(FFD8.*FFD9\).*//' | xxd -r -p >image.jpeg
- Com
hexdump
, o arquivoinput
é convertido em uma sequência semelhante à da sua pergunta.-
-e
especifica o formato -
1/1
significa aplicar o formato 1 vezes (contagem de iteração) e1
após o/
especificar o número de bytes a serem interpretados por cada iteração (contagem de bytes). -
%.2X
é o formato: um valor hexadecimal de dois dígitos.
-
- Em seguida,
sed
remove tudo antes deFFD8
e depois deFFD9
do despejo.- Os parênteses
\(...\)
especificam um subpadrão que queremos salvar para mais tarde - Substitua tudo por
, que é o conteúdo do subpadrão de cima.
- Os parênteses
- Pelo menos,
xxd
inverte o hexdump para um formato binário.
O teste é bem-sucedido quando você usa o exemplo em sua pergunta:
$ echo 0a 55 57 5d 50 cf ff d8 ff fe ff ff ff d9 df 47 fe e7 c9 3b e9 9b 6b 55 c4 57 9b 98 73 fd 15 f7 77 7e f7 95 dd 55 f7 55 05 cc 55 97 55 dd 62 d1 1f 51 ef f1 ef fb e9 bf ed 5f bf f2 9d 75 af fe 6b fb bf 8f f7 f7 7e ff d3 bf 8e d5 5f df 57 75 fe 77 7b bf d7 af df 5d fb 0a 47 de d5 ff c1 23 9b 20 08 20 65 3c 06 83 11 05 30 50 a0 20 55 20 84 41 04 c2 59 50 89 64 44 44 10 05 20 87 28 1d a9 | \
xxd -r -p | \
hexdump -ve '1/1 "%.2X"' | \
sed 's/.*\(FFD8.*FFD9\).*//' | \
xxd -r -p >image.jpeg
$
$ file image.jpeg
image.jpeg: JPEG image data
$ xxd image.jpeg
0000000: ffd8 fffe ffff ffd9 ........