У меня есть конфигурационные файлы со многими разделами. Мне нужно собрать все строки из конкретного раздела. Раздел может появляться несколько раз в одном файле.
Например:
serviceA:
ports:
8080
1323
serviceB:
test:
MMMM
ports:
8081
3123
network:
ddddd
Я читаю эту статью https://www.shellhacks.com/sed-awk-print-lines-between-two-patterns/ и начинаю.
Шаблон для начала раздела прост, это /ports:/
, но шаблон для конца раздела не так прост, это может быть любое имя, что-то вроде [a-zA-Z]+:
Я пытаюсь использовать шаблон [a-zA-Z]+:
в awk и sed.
В awk. На нем печатаются только названия разделов
awk '/ports:/,/[a-zA-Z]+:/' file
ports:
ports:
В сед. Он печатает от первых портов до конца файла
sed -n '/ports:/,/[a-zA-Z]+:/p' file
ports:
8080
1323
serviceB:
test:
MMMM
ports:
8081
3123
network:
ddddd
Я думал, что проблема в том, что шаблон [a-zA-Z]+:
соответствует портам: и решил исключить порты :.
^\s*((?!ports)[a-zA-Z]+:)+
Этот шаблон работает нормально в онлайн-тестере регулярных выражений - https://regex101.com/
awk печатает от первых портов до конца файла
awk '/ports:/,/^\s*((?!ports)[a-zA-Z]+:)+/' file
ports:
8080
1323
serviceB:
test:
MMMM
ports:
8081
3123
network:
ddddd
В настоящее время я нашел только один случай
awk '/ports:/,/network:|serviceB:/'
ports:
8080
1323
serviceB:
ports:
8081
3123
network:
Но я не знаю всех возможных названий разделов.
Мне нужно универсальное решение.