Решение sed
:
sed -nEe '/\[(prod|dev)_env]/!d;N;:loop' -e 's/.*\n//;${p;d;};N;P;/\n\[/D;bloop' hosts.yml
/\[(prod|dev)_env]/!d
отбрасывает все строки до тех пор, пока [prod_env]
или [dev_env]
не будут найдены N;:loop
добавляет следующую строку и запускает цикл s/.*\n//
, потому что это либо строка [...env]
, либо мы уже напечатали ее в последнем цикле цикла ${p;d;}
печатает оставшиеся строки, если мы достигли последней строки при печати N;P
добавляет следующую строку и печатает текущую /\n\[/D
проверяет, начинается ли следующая строка с [
. В этом случае первая строка в буфере (, уже напечатанная ), может быть отброшена, и мы начнем с этой строки [
bloop
иначе петля Вместо того, чтобы добавлять в буфер следующую строку, печатать и удалять старую, можно пройти построчно, но для этого потребуется еще один цикл, потому что нельзя начать заново сD