Obviamente, o formato permite várias quebras de linha, portanto o padrão N;P;D
não se encaixa muito bem: se você colecionar mais linhas, precisará imprimir e remover todas menos uma, mas P;D
não faz isso é por isso que você faz o material de substituição.
Aqui está a primeira maneira que posso pensar:
sed -e :a -e '$be' -e 'N;/\n[^+]/!ba' -e :e -e 'h;s/\n[^+].*//;/pch_25/s/^M/X/;p;g;/\n[^+]/!d;s/.*\n//;ba' file
Fazemos um loop para coletar linhas até atingirmos a última linha ou uma linha que não começa com +
. Em seguida, salve o padrão no espaço de espera e remova a última linha do espaço, se não estiver iniciando com +
. Agora todas as linhas que formam um registro estão juntas no espaço padrão; podemos fazer a substituição desejada e imprimi-lo.
Agora, o g
recupera o padrão antes de remover o início do próximo registro. Se ele não contiver uma nova linha seguida por um não- +
, ele será o último registro e poderemos d
excluí-lo e sair. Caso contrário, remova tudo menos a última linha e volte para marcar :a
.
(Observe que você não pode simplesmente usar s/.*\n\([^+]\)//;ta
, porque o t
pode ser acionado por uma substituição anterior de s
.)
Atualização: truque alternativo e sujo para usar N;P;D
de qualquer forma:
sed -e '/^end$/d;/^+/{P;D;};:a' -e '${x;s/.*/end/;H;x;};$!N;/\n[^+]/!ba' -e '/pch_25.*\n/s/^M/X/;P;D' file