सामान्य विचार: द्वारा विभाजित विखंडू में इनपुट पढ़ें \nval2=। अंतिम भाग को छोड़कर, जहाँ हम टेक्स्ट को पहली नई पंक्ति में बदलते हैं, हर छाँट को प्रिंट करें। यहाँ एक अपेक्षाकृत सरल gawk समाधान है जो अधिकांश मामलों को संभालता है:
gawk -v 'RS=\nval2=' -v ORS= \
'RT {print $0 RT} !RT {sub(/[^\n]*/, "yes"); print $0}'
यह मानता है कि पहली पंक्ति के साथ शुरू नहीं होता है val2=और कम से कम एक मैच है। दोनों दोषों को ठीक करने से स्क्रिप्ट काफी जटिल हो जाती है:
gawk -v 'RS=\nval2=' -v ORS= \
'!RT {if (NR==1) sub(/^val2=[^\n]*/, "val2=yes"); else sub(/[^\n]*/, "yes")}
{print $0 RT}'
यहां एक समान सामान्य सिद्धांत पर आधारित पर्ल समाधान है, लेकिन एक ही बार में पूरी फ़ाइल को पढ़ना है। मुझे यह स्पष्ट लगता है क्योंकि इसमें विशेष मामलों (खाली फ़ाइल के अलावा) को संभालने की आवश्यकता नहीं है।
perl -e 'undef $/;
@chunks = split /(?=^val2=)/m, <>;
$chunks[@chunks-1] =~ s/(?<=^val2=).*/yes/ if @chunks;
print @chunks'
पर्ल के विस्तारित रेगेक्स के साथ, हम एकल रेगेक्सपी प्रतिस्थापन का उपयोग कर सकते हैं। बस ^val2=उस मैच का अनुसरण करें जो दूसरे द्वारा नहीं किया गया है ^val2=:
perl -e 'undef $/; $_=<>; s/^val2=.*\n(?!.*\nval2=)/val2=yes\n/m; print'
मैंने पायथन का लाभ लेने की कोशिश की, rsplitजो अंतिम एन क्षेत्रों को विभाजित कर सकता है, लेकिन जब मैंने इसे अधिक क्रिप्टिक किए बिना काम नहीं कर पाया, तो मेरे पर्ल समाधान।