Естественные инструменты для этого являются awk и Perl (предполагающий, что Вы хотите написать сценарий: для некогда прочь, естественный инструмент является интерактивным редактором). Вот awk сценарий, который копирует все CLASS
…END
блоки (никакая балансировка не поддерживала: каждый CLASS
соответствует следующему END
), за исключением того, что foo
строки опущены из второй копии.
awk '
/^CLASS$/ { store = 1; } # start storing
store && ! /^foo$/ { hold = hold ORS $0; } # if storing, maybe save line
/^END$/ {
$0 = $0 hold; # append hold copy to current line
store = 0; hold = ""; # end of block
}
1 { print; } # print original line, with hold prepended if at end of block
'
Вот sed решение; не относитесь к нему слишком серьезно. Не ожидайте, что это будет вести себя если CLASS
/END
строки не находятся в строгом чередовании.
sed -e '/^CLASS$/,/^END$/!b' \
-e '/^CLASS$/{' -e 'h' -e 'b' -e '}' \
-e '/^foo$/!H' \
-e '/^END$/G'
Если Вы будете не мочь позволить себе жить с рисками прокручивающегося дистрибутива выпуска (иногда, то вещи повредятся, и обновления не будут гладкими - это на основе моего опыта с Arch), ожидайте Монетного двора 13.
Иначе находящийся в Debian Монетный двор должен быть в порядке.