यहाँ एक और है sed
:
sed -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D <in >out
जैसा आप पूछते हैं। यह केवल एक स्टैक पर काम करता है - इसे आवश्यक रूप से और जब तक आवश्यक हो, तब तक टिप्पणी की गई लाइनों की घटनाओं के बीच, और जब यह एक मिल जाए, तो इनपुट में आगे नई टिप्पणी लाइन के पक्ष में पुराने बफर को डंप करना। चित्र...
क्षमा करें, मुझे नहीं पता कि मैंने ऐसा क्यों किया। लेकिन यह ध्यान में आया।
वैसे भी, sed
किसी भी श्रृंखला में प्रत्येक अंतिम टिप्पणी लाइन के बीच अपने बफ़र्स को फैलाता है, कभी भी इसके बफर में एक भी अधिक को बनाए रखने की तुलना में अंतिम टिप्पणी की घटना को सही ढंग से ट्रैक करने के लिए आवश्यक नहीं है, और यदि किसी भी समय यह अंतिम पंक्ति का सामना करता है तो ऐसा करने का प्रयास करेगा अंतिम g
लोबाल निष्पादन विवरण और शाखा t
पूरे बफर को मुद्रित करने के लिए बाहर ले जाती है, अन्यथा यह P
उन सभी पंक्तियों को चीर देगा जो यह अपने बफर से रिलीज होते ही करता है।
मुझे लगता है कि यह मन में समझौते लाया है ...
printf %s\\n \#alice \#bob charlie dotan eric \
\#alice \#bob charlie dotan eric \
\#alice \#bob charlie dotan eric |
sed -e:n -e'l;/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D
#alice
#alice\n#bob$
#alice\n#bob\ncharlie$
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob\ncharlie\ndotan\neric\n#alice$
#bob\ncharlie\ndotan\neric\n#alice\n#bob$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
#bob
charlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
charlie
dotan\neric\n#alice\n#bob\ncharlie\ndotan$
dotan
eric\n#alice\n#bob\ncharlie\ndotan$
eric
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob\ncharlie\ndotan\neric\n#alice$
#bob\ncharlie\ndotan\neric\n#alice\n#bob$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
#bob
charlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
charlie
dotan\neric\n#alice\n#bob\ncharlie\ndotan$
dotan
eric\n#alice\n#bob\ncharlie\ndotan$
eric
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob
#charlie
#dotan
eric
इस कमांड और ऊपर वाले के बीच केवल एक अंतर है और वह है l
शीर्ष पर ook कमांड। हम जब l
से OOK sed
के पैटर्न स्थान के रूप में यह काम करता है हम और पर्दे के पीछे क्या पर चला जाता है का एक बेहतर विचार कैसे अपने प्रयासों को निर्देशित करने के लिए की एक बेहतर समझ प्राप्त कर सकते हैं।
इस मामले में हम sed
स्टैक इनपुट देख सकते हैं जब तक कि इनपुट की दूसरी घटना नहीं मिली है \n#.*\ndotan
, और यह कि जब यह एक बार में पिछले लाइन को प्रिंट करना शुरू करता है। यह थोड़े शांत है। मैंने इस पर बहुत काम किया।