Idéia geral: leia a entrada em blocos separados por \nval2=
. Imprima todos os pedaços como estão, exceto pelo último trecho onde mudamos o texto até a primeira nova linha. Aqui está uma solução Gawk relativamente simples que lida com a maioria dos casos:
gawk -v 'RS=\nval2=' -v ORS= \
'RT {print $0 RT} !RT {sub(/[^\n]*/, "yes"); print $0}'
Isso pressupõe que a primeira linha não comece com val2=
e que haja pelo menos uma correspondência. Corrigir os dois defeitos complica significativamente o script:
gawk -v 'RS=\nval2=' -v ORS= \
'!RT {if (NR==1) sub(/^val2=[^\n]*/, "val2=yes"); else sub(/[^\n]*/, "yes")}
{print $0 RT}'
Aqui está uma solução Perl baseada no mesmo princípio geral, mas lendo o arquivo inteiro de uma só vez. Eu acho mais claro porque não tem que lidar com casos especiais (além do arquivo vazio).
perl -e 'undef $/;
@chunks = split /(?=^val2=)/m, <>;
$chunks[@chunks-1] =~ s/(?<=^val2=).*/yes/ if @chunks;
print @chunks'
Com os regexps estendidos do Perl, podemos usar uma única substituição de expressão regular. Basta combinar o ^val2=
que não é seguido por outro ^val2=
:
perl -e 'undef $/; $_=<>; s/^val2=.*\n(?!.*\nval2=)/val2=yes\n/m; print'
Eu tentei tirar proveito do rsplit
do Python, que pode separar os últimos N campos, mas desisti quando não consegui fazê-lo funcionar sem ser muito mais enigmático do que minhas soluções Perl.