ज्यादातर मामलों में डॉन बेहतर हो सकता है, लेकिन सिर्फ इस मामले में कि फाइल वास्तव में बड़ी है, और आप sedएक स्क्रिप्ट फाइल को संभाल नहीं सकते हैं जो बड़ी (जो कि स्क्रिप्ट की लगभग 5000+ पंक्तियों पर हो सकती है) , यहाँ यह सादे के साथ है sed:
sed -ne:t -e"/\n.*$match/D" \
-e'$!N;//D;/'"$match/{" \
-e"s/\n/&/$A;t" \
-e'$q;bt' -e\} \
-e's/\n/&/'"$B;tP" \
-e'$!bt' -e:P -e'P;D'
यह एक उदाहरण है जिसे इनपुट पर स्लाइडिंग विंडो कहा जाता है । यह कुछ भी मुद्रित करने का प्रयास करने से पहले -count लाइनों के लुक-$B फॉरवर्ड बफर का निर्माण करके काम करता है ।
और वास्तव में, शायद मुझे अपने पिछले बिंदु को स्पष्ट करना चाहिए: इस समाधान और डॉन दोनों के लिए प्राथमिक प्रदर्शन सीमांत सीधे अंतराल से संबंधित होगा। यह समाधान बड़े अंतराल के आकार के साथ धीमा होगा , जबकि बड़े अंतराल आवृत्तियों के साथ डॉन की गति धीमी होगी । दूसरे शब्दों में, भले ही इनपुट फ़ाइल बहुत बड़ी है, अगर वास्तविक अंतराल घटना अभी भी बहुत ही अनियंत्रित है, तो उसका समाधान संभवतः जाने का रास्ता है। हालांकि, यदि अंतराल आकार अपेक्षाकृत प्रबंधनीय है, और अक्सर होने की संभावना है, तो यह वह समाधान है जिसे आपको चुनना चाहिए।
तो यहाँ वर्कफ़्लो है:
- यदि
$matchएक \nईवलाइन से पहले के पैटर्न स्पेस में पाया जाता है , तो पूर्ववर्ती हर ईवलाइन sedको पुन: प्राप्त कर लेगा जो इसे पसंद करता है।
D\n
- मैं
$matchपहले से पूरी तरह से पैटर्न की जगह को साफ कर रहा था - लेकिन आसानी से ओवरलैप को संभालने के लिए, एक लैंडमार्क को छोड़ना कहीं बेहतर काम लगता है।
- मैंने
s/.*\n.*\($match\)/\1/इसे एक बार में प्राप्त करने का प्रयास किया और लूप को चकमा दिया, लेकिन जब $A/$Bबड़े होते हैं, तो Dइलेट लूप काफी तेज साबित होता है।
- फिर हम
Nएक \newline सीमांकक से पहले इनपुट की एक्सट्रीम लाइन में खींचते हैं और अपने सबसे हाल ही में उपयोग किए गए रेगुलर एक्सप्रेशन w / का हवाला देकर Dएक /\n.*$match/बार फिर से ई-मेल करने की कोशिश करते हैं //।
- यदि पैटर्न स्पेस मेल करता है
$matchतो यह केवल $matchपंक्ति के प्रमुख के साथ ही हो सकता है - सभी $Before पंक्तियों को साफ़ कर दिया गया है।
- तो हम
$After पर लूपिंग शुरू करते हैं ।
- इस लूप के प्रत्येक रन हम करने का प्रयास करेंगे
s///ubstitute के लिए &खुद को $Aवें \nपैटर्न अंतरिक्ष में ewline चरित्र, और, यदि सफल, tहमारे पूरे और - स्था हमें शाखा जाएगा $After बफर - बाहर स्क्रिप्ट की पूरी तरह से ऊपर से अधिक स्क्रिप्ट शुरू करने के लिए अगली इनपुट लाइन के साथ यदि कोई हो।
- अगर
tएस्ट सफल नहीं है, तो हम ऑप लेबल पर bवापस :tआएँगे और इनपुट की एक और लाइन के लिए फिर से जुट जाएँगे - संभवतया लूप को शुरू करने पर अगर फेरी $matchइकट्ठा करते समय होती है $A।
- अगर हम अतीत एक मिल
$matchसमारोह पाश, तो हम करने की कोशिश करेंगे pप्रिंट करें $अंतिम पंक्ति है कि अगर यह यह है, और अगर !की कोशिश मत s///के लिए ubstitute &खुद $Bवें \nपैटर्न अंतरिक्ष में ewline चरित्र।
- हम इसे भी
tइस्ट करेंगे , और अगर यह सफल होता है तो हम :Pरिंट लेबल पर शाखा देंगे ।
- यदि हम
:top करने के लिए वापस शाखा नहीं करेंगे और बफर में संलग्न एक और इनपुट लाइन प्राप्त करेंगे ।
- अगर हम यह करने के लिए
:Pप्रिंट करें हम करेंगे Pतो प्रिंट करें Dपहले अप करने के लिए हटाएं \nपैटर्न अंतरिक्ष में ewline और क्या रहता है के साथ ऊपर से स्क्रिप्ट को फिर से चलाएं।
और इसलिए इस बार, अगर हम कर रहे थे A=2 B=2 match=5; seq 5 | sed...
:Pरिंट पर पहले पुनरावृत्ति के लिए पैटर्न स्थान इस तरह दिखेगा:
^1\n2\n3$
और इसी तरह से sedइसके $Before बफर को इकट्ठा करता है । और इसलिए जो इनपुट इकट्ठा हुआ है उसके पीछेsed आउटपुट $Bलाइनों को प्रिंट करता है। इसका मतलब यह है कि, हमारे पिछले उदाहरण को देखते हुए, आउटपुट के लिए रिंट होगा , और फिर उस एलीट और स्क्रिप्ट के शीर्ष पर वापस भेजें जो एक पैटर्न स्पेस की तरह दिखता है:sedP1D
^2\n3$
... और स्क्रिप्ट के शीर्ष पर Nएक्सट्रीम इनपुट लाइन को पुनः प्राप्त किया जाता है और इसलिए अगला पुनरावृति जैसा दिखता है:
^2\n3\n4$
और इसलिए जब हम 5इनपुट की पहली घटना पाते हैं , तो पैटर्न स्पेस वास्तव में जैसा दिखता है:
^3\n4\n5$
फिर Dईट लूप में किक करता है और जब इसके माध्यम से ऐसा दिखता है:
^5$
और जब Nएक्सट्रीम इनपुट लाइन खींची जाती है तो sedईओएफ और क्विट्स हिट होते हैं। उस समय तक यह केवल P1 और 2 की पंक्तियों का संकेत देता है।
यहाँ एक उदाहरण चलाया गया है:
A=8 B=7 match='[24689]0'
seq 100 |
sed -ne:t -e"/\n.*$match/D" \
-e'$!N;//D;/'"$match/{" \
-e"s/\n/&/$A;t" \
-e'$q;bt' -e\} \
-e's/\n/&/'"$B;tP" \
-e'$!bt' -e:P -e'P;D'
वह प्रिंट:
1
2
3
4
5
6
7
8
9
10
11
12
29
30
31
32
49
50
51
52
69
70
71
72
99
100