As ferramentas naturais para isso são o awk e o Perl (supondo que você queira fazer o script: para uma vez, a ferramenta natural é um editor interativo). Aqui está um script awk que duplica todos os CLASS
… END
blocks (nenhum balanceamento suportado: cada CLASS
corresponde ao próximo END
), exceto que foo
lines são omitidos da segunda cópia.
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
'
Aqui está uma solução sed; não leve muito a sério. Não espere que ele se comporte se as linhas CLASS
/ END
não estiverem em uma alternância estrita.
sed -e '/^CLASS$/,/^END$/!b' \
-e '/^CLASS$/{' -e 'h' -e 'b' -e '}' \
-e '/^foo$/!H' \
-e '/^END$/G'