ज्यादातर मामलों में डॉन बेहतर हो सकता है, लेकिन सिर्फ इस मामले में कि फाइल वास्तव में बड़ी है, और आप 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
एक \n
ewline सीमांकक से पहले इनपुट की एक्सट्रीम लाइन में खींचते हैं और अपने सबसे हाल ही में उपयोग किए गए रेगुलर एक्सप्रेशन w / का हवाला देकर D
एक /\n.*$match/
बार फिर से ई-मेल करने की कोशिश करते हैं //
।
- यदि पैटर्न स्पेस मेल करता है
$match
तो यह केवल $match
पंक्ति के प्रमुख के साथ ही हो सकता है - सभी $B
efore पंक्तियों को साफ़ कर दिया गया है।
- तो हम
$A
fter पर लूपिंग शुरू करते हैं ।
- इस लूप के प्रत्येक रन हम करने का प्रयास करेंगे
s///
ubstitute के लिए &
खुद को $A
वें \n
पैटर्न अंतरिक्ष में ewline चरित्र, और, यदि सफल, t
हमारे पूरे और - स्था हमें शाखा जाएगा $A
fter बफर - बाहर स्क्रिप्ट की पूरी तरह से ऊपर से अधिक स्क्रिप्ट शुरू करने के लिए अगली इनपुट लाइन के साथ यदि कोई हो।
- अगर
t
एस्ट सफल नहीं है, तो हम ऑप लेबल पर b
वापस :t
आएँगे और इनपुट की एक और लाइन के लिए फिर से जुट जाएँगे - संभवतया लूप को शुरू करने पर अगर फेरी $match
इकट्ठा करते समय होती है $A
।
- अगर हम अतीत एक मिल
$match
समारोह पाश, तो हम करने की कोशिश करेंगे p
प्रिंट करें $
अंतिम पंक्ति है कि अगर यह यह है, और अगर !
की कोशिश मत s///
के लिए ubstitute &
खुद $B
वें \n
पैटर्न अंतरिक्ष में ewline चरित्र।
- हम इसे भी
t
इस्ट करेंगे , और अगर यह सफल होता है तो हम :P
रिंट लेबल पर शाखा देंगे ।
- यदि हम
:t
op करने के लिए वापस शाखा नहीं करेंगे और बफर में संलग्न एक और इनपुट लाइन प्राप्त करेंगे ।
- अगर हम यह करने के लिए
:P
प्रिंट करें हम करेंगे P
तो प्रिंट करें D
पहले अप करने के लिए हटाएं \n
पैटर्न अंतरिक्ष में ewline और क्या रहता है के साथ ऊपर से स्क्रिप्ट को फिर से चलाएं।
और इसलिए इस बार, अगर हम कर रहे थे A=2 B=2 match=5; seq 5 | sed...
:P
रिंट पर पहले पुनरावृत्ति के लिए पैटर्न स्थान इस तरह दिखेगा:
^1\n2\n3$
और इसी तरह से sed
इसके $B
efore बफर को इकट्ठा करता है । और इसलिए जो इनपुट इकट्ठा हुआ है उसके पीछेsed
आउटपुट $B
लाइनों को प्रिंट करता है। इसका मतलब यह है कि, हमारे पिछले उदाहरण को देखते हुए, आउटपुट के लिए रिंट होगा , और फिर उस एलीट और स्क्रिप्ट के शीर्ष पर वापस भेजें जो एक पैटर्न स्पेस की तरह दिखता है:sed
P
1
D
^2\n3$
... और स्क्रिप्ट के शीर्ष पर N
एक्सट्रीम इनपुट लाइन को पुनः प्राप्त किया जाता है और इसलिए अगला पुनरावृति जैसा दिखता है:
^2\n3\n4$
और इसलिए जब हम 5
इनपुट की पहली घटना पाते हैं , तो पैटर्न स्पेस वास्तव में जैसा दिखता है:
^3\n4\n5$
फिर D
ईट लूप में किक करता है और जब इसके माध्यम से ऐसा दिखता है:
^5$
और जब N
एक्सट्रीम इनपुट लाइन खींची जाती है तो sed
ईओएफ और क्विट्स हिट होते हैं। उस समय तक यह केवल P
1 और 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