Genel fikir: girdiyi, ayrılmış \nval2=
. Metni ilk satırsonuna kadar değiştirdiğimiz son yığın dışında her parçayı olduğu gibi yazdırın. İşte çoğu durumda işleyen nispeten basit bir çözüm.
gawk -v 'RS=\nval2=' -v ORS= \
'RT {print $0 RT} !RT {sub(/[^\n]*/, "yes"); print $0}'
Bu, ilk satırın başlamadığını varsayar val2=
ve en az bir maç olduğunu. Her iki hatayı düzeltmek senaryoyu belirgin şekilde karmaşıklaştırır:
gawk -v 'RS=\nval2=' -v ORS= \
'!RT {if (NR==1) sub(/^val2=[^\n]*/, "val2=yes"); else sub(/[^\n]*/, "yes")}
{print $0 RT}'
İşte aynı genel prensibi temel alan bir Perl çözümü, ancak tüm dosyayı bir kerede okuyor. Daha net buluyorum çünkü özel davalarla uğraşmak zorunda kalmıyor (boş dosya dışında).
perl -e 'undef $/;
@chunks = split /(?=^val2=)/m, <>;
$chunks[@chunks-1] =~ s/(?<=^val2=).*/yes/ if @chunks;
print @chunks'
Perl'in genişletilmiş regexps'i ile tek bir regexp ikamesi kullanabiliriz. Sadece eşle ^val2=
bu başka bir kişi tarafından takip edilmedi ^val2=
:
perl -e 'undef $/; $_=<>; s/^val2=.*\n(?!.*\nval2=)/val2=yes\n/m; print'
Python'ın avantajlarından yararlanmaya çalıştım rsplit
Son N alanlarını ayırabilir, ancak Perl çözümlerine göre daha fazla şifreli olmadan çalışamadığımda vazgeçtim.