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