Linux находит часть между двумя экземплярами и записывает их в несколько выходов - PullRequest
0 голосов
/ 09 мая 2018

У меня есть файл с кодировками PNG-изображений внутри. Я хотел бы извлечь изображения PNG из этого файла. Каждое PNG-изображение начинается с «PNG» и заканчивается словом «IEND». Сам файл содержит более одного изображения в формате PNG (найдено 279 совпадений).

Как я могу извлечь все эти изображения в отдельные файлы? Я пробовал много команд sed и awk, но мне не удалось создать несколько выходных файлов. Например.

sed -n '/PNG/,/IEND/p' file1 > file2

Как я могу сделать это для создания 279 файлов PNG?

Часть файла:

PNG

... IHDR ...'...'... Q5 ... pHYs ..... ... IDATX 1 0W * BBpPxAqWĂC3EOEB +. Ո 9 EθMb! / ] XgY.5oǁC + қQhO (JqVRUq} BZE \ Kw͙xfn $ хо & 7) 1Lw / а {W1 .... IENDB` .... PNG

... IHDR ... & ... $ ... + ... gAMA..a ... SRGB .... uPLTE D AGB " 'koKO6: "" "555Zpwp .." IDAT8v a = 1- 1 ؃ . om b 窴 ' ? ByU} [ Ξ Թ 8 м ^ 8 / q L (I! L Bx ( [A n 3 5 u ] S & - a] е & а: Bh1G-9GCx (NkJTe-0%84@.D ִ 1 ~ jV ̹ΐ /: ԁ r { ّ ^ 3۩ < ) l) IeRcRCRp0gr »M .... IENDB` ..

Это файл, над которым я работаю: https://drive.google.com/open?id=1phPnEyGFWeHlXsGup9R35STf-NaGgFGR (изображение также добавлено, чтобы показать код файла PNG, я хочу извлечь эти части файла)

This is the example of file

1 Ответ

0 голосов
/ 09 мая 2018

Этот awk однострочный должен помочь:

awk '/PNG/{y=1}y{print > "file"i+1}/IEND/{y=0;i++}' file

Тест:

kent$  cat f
PNG
1
2
IEND
PNG
3
4
IEND
PNG
5
IEND

kent$  awk '/PNG/{y=1}y{print > "file"i+1}/IEND/{y=0;i++}' f

kent$  head file*
==> file1 <==
PNG
1
2
IEND

==> file2 <==
PNG
3
4
IEND

==> file3 <==
PNG
5
IEND

Примечание

добавить close("file"i+1) в IEND блок: /IEND/{close("file"i+1);y=0;i++} если у вас есть сообщение об ошибке типа «слишком много файлов открыто»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...