Как извлечь несколько строк между многострочным шаблоном и вторым строковым шаблоном - PullRequest
0 голосов
/ 20 февраля 2019

Цель состоит в том, чтобы получить версию пакета с исходным кодом в deb-репозитории на основе prespro.

Поскольку отслеживание пакетов с исходным кодом все еще является экспериментальным в представительском представлении, у команды list есть проблемы с --list-параметр формата и, следовательно, не может использоваться в этом случае использования.

Отрывок вывода команды для распечатки всей информации о отслеживаемых исходных пакетах:

...

Distribution: buster
Source: linux-latest
Version: 102
Files:
 pool/stable/l/linux-latest/linux-doc_4.19+102_all.deb a 2
 pool/stable/l/linux-latest/linux-headers-amd64_4.19+102_amd64.deb b 1
 pool/stable/l/linux-latest/linux-headers-cloud-amd64_4.19+102_amd64.deb b 1
 pool/stable/l/linux-latest/linux-headers-rt-amd64_4.19+102_amd64.deb b 1
 pool/stable/l/linux-latest/linux-image-amd64_4.19+102_amd64.deb b 1
 pool/stable/l/linux-latest/linux-image-amd64-dbg_4.19+102_amd64.deb b 1
 pool/stable/l/linux-latest/linux-image-cloud-amd64_4.19+102_amd64.deb b 1
 pool/stable/l/linux-latest/linux-image-cloud-amd64-dbg_4.19+102_amd64.deb b 1
 pool/stable/l/linux-latest/linux-image-rt-amd64_4.19+102_amd64.deb b 1
 pool/stable/l/linux-latest/linux-image-rt-amd64-dbg_4.19+102_amd64.deb b 1
 pool/stable/l/linux-latest/linux-perf_4.19+102_all.deb a 2
 pool/stable/l/linux-latest/linux-source_4.19+102_all.deb a 2

Distribution: buster
Source: linux-latest
Version: 103
Files:
 pool/stable/l/linux-latest/linux-doc_4.19+103_all.deb a 0
 pool/stable/l/linux-latest/linux-headers-amd64_4.19+103_amd64.deb b 1
 pool/stable/l/linux-latest/linux-headers-cloud-amd64_4.19+103_amd64.deb b 1
 pool/stable/l/linux-latest/linux-headers-rt-amd64_4.19+103_amd64.deb b 1
 pool/stable/l/linux-latest/linux-image-amd64_4.19+103_amd64.deb b 1
 pool/stable/l/linux-latest/linux-image-amd64-dbg_4.19+103_amd64.deb b 1
 pool/stable/l/linux-latest/linux-image-cloud-amd64_4.19+103_amd64.deb b 1
 pool/stable/l/linux-latest/linux-image-cloud-amd64-dbg_4.19+103_amd64.deb b 1
 pool/stable/l/linux-latest/linux-image-rt-amd64_4.19+103_amd64.deb b 1
 pool/stable/l/linux-latest/linux-image-rt-amd64-dbg_4.19+103_amd64.deb b 1
 pool/stable/l/linux-latest/linux-perf_4.19+103_all.deb a 2
 pool/stable/l/linux-latest/linux-source_4.19+103_all.deb a 2

...

Цель здесьполучить версию, например, linux-latest исходного пакета, используя, например, имя двоичного пакета linux-source_4.19+103_all.deb, выделив все строки между:

1) многострочным шаблоном:

Distribution: buster
Source: linux-latest

2) строковый шаблон:

linux-source_4.19+103_all.deb

Имя дистрибутива, имя пакета с исходным кодом и имена двоичных пакетов являются переменными, поэтому число захваченных строк является переменным, но базовый макет остается постоянным.

По этой же причине кажется, что pcre2grep --multiline здесь нельзя использовать.

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

Другие ответы на стекопоток, кажется, здесь не применимы:

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Это может работать для вас (GNU sed):

sed '/^Distribution: buster$/{:a;N;/\n\s*$/!ba;/^Source: linux-latest$/Ms/.*Version: \(\S\+\).*/\1/p};d' file

Соберите строки для определенного Distribution и используйте сопоставление с образцом, чтобы затем извлечь необходимые Version.

Это может быть обобщено для любого Distribution набора строк:

sed '/^Distribution/{:a;N;/\n$/!ba;/linux-source_4.19+103_all.deb/s/.*Version: \(\S\+\).*/\1/p};d' file

Таким образом, первое решение может быть записано:

sed '/^Distribution/{:a;N;/\n$/!ba;/Distribution: buster\nSource: linux-latest/s/.*Version: \(\S\+\).*/\1/p};d' file

или, если вы предпочитаете:

sed '/^Distribution/{:a;N;/\n$/!ba;/^Distribution: buster$/M!b;/^Source: linux-latest$/M!b;s/.*Version: \(\S\+\).*/\1/p};d' file

NB. Необходимо соблюдать осторожность, чтобы заключать в кавычки любые метасимволы, которые могут быть в совпадающей строке, т. Е. Должны быть указаны такие символы, как []*., например, [ становится \[.

0 голосов
/ 20 февраля 2019

Не совсем понятно, что вы пытаетесь сделать, но я думаю вы говорите, что хотите напечатать значение версии, когда в записи появляется конкретная строка.Если это так, то просто:

$ awk -v str='linux-source_4.19+103_all.deb' -F': *' '{f[$1]=$2} index($0,str){print f["Version"]}' file
103

Если вы хотите также проверить наличие конкретного дистрибутива и источника, это просто настройка:

$ awk -v str='linux-source_4.19+103_all.deb' -v dist='buster' -v src='linux-latest' -F': *' '
    { f[$1] = $2 }
    (f["Distribution"]==dist) && (f["Source"]==src) && index($0,str) { print f["Version"] }
' file
103

Если вам нужно что-то другое, отредактируйте свой вопрос науточнить ваши требования.

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