यदि किसी मैच के तुरंत बाद किसी भी लाइन को हटा दिया जाना चाहिए, तो आपके sed
प्रोग्राम को लगातार मैचों पर विचार करना होगा। दूसरे शब्दों में, यदि आप किसी मैच के बाद वाली लाइन को हटाते हैं, जो मैच भी करता है, तो संभवत: आपको उसी के बाद की लाइन को हटा देना चाहिए।
यह बस पर्याप्त रूप से लागू किया जाता है - लेकिन आपको थोड़ा पीछे देखना होगा।
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
यह पढ़ी गई प्रत्येक पंक्ति के लिए पकड़ और पैटर्न रिक्त स्थान को स्वैप करके काम करता है - इसलिए अंतिम पंक्ति की वर्तमान की तुलना हर बार की जा सकती है। इसलिए जब sed
एक पंक्ति पढ़ता है तो यह अपने बफ़र्स की सामग्री का आदान-प्रदान करता है - और पिछली पंक्ति फिर इसके एडिट बफर की सामग्री है, जबकि वर्तमान लाइन को होल्ड स्पेस में रखा गया है।
तो sed
एक मैच के लिए पिछली पंक्ति की जाँच करता है match
, और यदि इसके !
नहीं मिला तो {
फ़ंक्शन के दो भाव }
चलते हैं। sed
होगा g
एट पैटर्न अंतरिक्ष ओवरराइट करके पकड़ अंतरिक्ष - जिसका अर्थ है वर्तमान पंक्ति दोनों पकड़ और पैटर्न रिक्त स्थान में तो है - और फिर यह होगा //
इसकी सबसे हाल ही में संकलित नियमित एक्सप्रेशन के मेल के लिए जाँच - match
- और अगर यह नहीं है match
यह है p
rinted।
इसका मतलब है कि एक लाइन केवल तभी प्रिंट होती है जब वह नहीं होती है और तुरंत पिछली लाइन नहीं होती है । यह es के अनुक्रमों के लिए किसी भी अनावश्यक स्वैप को भी समाप्त कर देता है ।match
match
match
यदि आप एक ऐसा संस्करण चाहते हैं जो एक मनमानी संख्या को छोड़ सकता है जो match
इसके बाद होने वाली लाइनों को थोड़ा और काम करने की आवश्यकता होगी:
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... 5 की जगह लाइनों की संख्या (मिलान लाइन सहित) जिसे आप निकालना चाहते हैं ...
1
2
3
4
12
13
14
21