Você poderia dar uma chance a 'sed' ...
sed -ri ':x;$!{N;bx};s/% ([^\n]*)(\n|$)/<tag><\/tag>\n/g;s/<\/tag>\n<tag>/\n/g;s/\n$//' tst.txt
Isso marcará seu arquivo no lugar.
Explicação:
-
:x;$!{N;bx}
- > globbing arquivo para um bufferline -
s/% ([^\n]*)(\n|$)/<tag><\/tag>\n/g
- > Marcando todas as linhas que começam com '%' -
s/<\/tag>\n<tag>/\n/g
- > excluir tags desnecessárias (se a tag de fechamento for seguida pela tag de abertura) -
s/\n$//
- > excluir nova linha desnecessária no final do arquivo
Eventualmente, é possível fazê-lo ainda mais curto, mas essa foi a primeira maneira direta que eu pude imaginar.