स्ट्रीम संपादक - प्रबंध पैटर्न

हमने पहले ही पैटर्न और होल्ड बफर के उपयोग पर चर्चा की है। इस अध्याय में, हम उनके उपयोग के बारे में और जानने जा रहे हैं। आइए चर्चा करते हैंnकमांड जो पैटर्न स्पेस प्रिंट करता है। इसका इस्तेमाल अन्य कमांड्स के साथ मिलकर किया जाएगा। नीचे दिए गए तत्कालीन कमांड का सिंटैक्स है।

[address1[,address2]]n

एक उदाहरण लेते हैं।

[jerry]$ sed 'n' books.txt

जब उपरोक्त कोड निष्पादित होता है, तो यह निम्नलिखित परिणाम देगा:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

n कमांड पैटर्न बफर की सामग्री को प्रिंट करता है, पैटर्न बफर को साफ करता है, पैटर्न बफर में अगली लाइन लाता है, और उस पर कमांड लागू करता है।

आइए विचार करें कि पहले तीन SED कमांड हैं n और दो SED कमांड के बाद n निम्नलिखित नुसार:

Sed command #1 
Sed command #2 
Sed command #3 
n command 
Sed command #4 
Sed command #5

इस स्थिति में, SED पैटर्न बफ़र पर पहले तीन आदेशों को लागू करता है, पैटर्न बफ़र को साफ़ करता है, पैटर्न बफ़र में अगली पंक्ति लाता है, और उसके बाद उस पर चौथा और पाँचवाँ आदेश लागू करता है। यह एक बहुत ही महत्वपूर्ण अवधारणा है। इसकी स्पष्ट समझ के बिना आगे नहीं बढ़ें।

होल्ड बफर डेटा रखता है, लेकिन SED कमांड सीधे होल्ड बफर पर लागू नहीं किया जा सकता है। इसलिए, हमें पकड़ बफर डेटा को पैटर्न बफर में लाने की आवश्यकता है। SED प्रदान करता हैxपैटर्न की सामग्री का आदान-प्रदान करने और बफ़र्स रखने की आज्ञा। निम्नलिखित आदेशों का वर्णन हैx आदेश।

चलिए Books.txt फाइल को थोड़ा संशोधित करते हैं। कहते हैं, फ़ाइल में उनके लेखक नामों के बाद पुस्तक के शीर्षक हैं। संशोधन के बाद, फ़ाइल को इस तरह दिखना चाहिए:

[jerry]$ cat books.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलता है:

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage 
Paulo Coelho 
A Game of Thrones 
George R. R. Martin

आइए हम दो बफ़र्स की सामग्री का आदान-प्रदान करते हैं। उदाहरण के लिए, निम्न उदाहरण केवल लेखकों के नाम को छापता है।

[jerry]$ sed -n 'x;n;p' books.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलता है:

George R. R. Martin 
J. R. R. Tolkien 
Paulo Coelho 
J. R. R. Tolkien 
Paulo Coelho 
George R. R. Martin

आइए हम समझते हैं कि यह कमांड कैसे काम करता है।

  • प्रारंभ में, SED ने पैटर्न बफर में पहली पंक्ति, अर्थात, ए स्टॉर्म ऑफ़ स्वॉर्ड्स को पढ़ा।

  • x कमांड इस लाइन को होल्ड बफर में ले जाती है।

  • n पैटर्न बफर में अगली पंक्ति, यानी, जॉर्ज आरआर मार्टिन को लाया जाता है।

  • नियंत्रण n के बाद कमांड को पास करता है जो पैटर्न बफर की सामग्री को प्रिंट करता है।

  • फ़ाइल समाप्त होने तक प्रक्रिया दोहराती है।

अब मुद्रण से पहले बफ़र्स की सामग्री का आदान-प्रदान करते हैं। लगता है, क्या होता है? हां, यह किताबों के शीर्षक छापता है।

[jerry]$ sed -n 'x;n;x;p' books.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलता है:

A Storm of Swords 
The Two Towers 
The Alchemist 
The Fellowship of the Ring 
The Pilgrimage 
A Game of Thrones

hकमांड बफ़र से संबंधित है। यह पैटर्न बफर से होल्ड बफर के डेटा को कॉपी करता है। होल्ड बफर से मौजूदा डेटा ओवरराइट हो जाता है। ध्यान दें किhकमांड डेटा को स्थानांतरित नहीं करता है, यह केवल डेटा को कॉपी करता है। इसलिए, कॉपी किया गया डेटा वैसा ही रहता है जैसा कि पैटर्न बफर में होता है। नीचे दिए गए का सिंटैक्स हैh आदेश।

[address1[,address2]]h

निम्नलिखित कमांड केवल लेखक पाउलो कोएलो के शीर्षक को प्रिंट करता है।

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलता है:

The Alchemist 
The Pilgrimage

आइए हम समझते हैं कि उपरोक्त कमांड कैसे काम करता है। Books.txt की सामग्री एक विशिष्ट प्रारूप का अनुसरण करती है। पहली पंक्ति पुस्तक का शीर्षक है जिसके बाद पुस्तक के लेखक हैं। उपरोक्त आदेश में, "!" का उपयोग स्थिति को उलटने के लिए किया जाता है, अर्थात, लाइन को होल्ड बफ़र पर कॉपी किया जाता है, जब एक पैटर्न मैच सफल नहीं होता है। और कर्ली ब्रेसेस {} का उपयोग कई SED कमांड्स को ग्रुप करने के लिए किया जाता है

कमांड के पहले पास में, SED पैटर्न बफर में पहली पंक्ति, अर्थात, ए स्टॉर्म ऑफ़ स्वॉर्ड्स को पढ़ता है और जांचता है कि इसमें पैटर्न पाउलो है या नहीं। जैसा कि पैटर्न मैच सफल नहीं होता है, यह इस लाइन को होल्ड बफर पर कॉपी कर देता है। अब दोनों पैटर्न बफर और होल्ड बफर में एक ही लाइन अर्थात, ए स्टॉर्म ऑफ़ स्वॉर्ड्स होते हैं। दूसरे चरण में, यह जांचता है कि लाइन में पैटर्न पाउलो है या नहीं। जैसा कि पैटर्न से मेल नहीं खाता है, यह कुछ भी नहीं करता है।

दूसरे पास में, यह पैटर्न बफर में अगली पंक्ति जॉर्ज आरआर मार्टिन को पढ़ता है और समान चरणों को लागू करता है। अगली तीन पंक्तियों के लिए, यह वही काम करता है। पाँचवीं पास के अंत में, दोनों बफ़र्स में द अल्केमिस्ट शामिल हैं। छठे पास की शुरुआत में, यह लाइन पाउलो कोएल्हो को पढ़ता है और पैटर्न से मेल खाता है, यह इस लाइन को होल्ड बफर में कॉपी नहीं करता है। इसलिए, पैटर्न बफ़र में पाउलो कोएल्हो होता है, और होल्ड बफ़र में अल्केमिस्ट होता है।

इसके बाद, यह जाँच करता है कि पैटर्न बफर में पैटर्न पाउलो शामिल है या नहीं। जैसे ही पैटर्न मैच सफल होता है, यह पकड़ बफर के साथ पैटर्न बफर की सामग्री का आदान-प्रदान करता है। अब पैटर्न बफर में अल्केमिस्ट और होल्ड बफर में पाउलो कोएल्हो शामिल हैं। अंत में, यह पैटर्न बफर की सामग्री को प्रिंट करता है। एक ही कदम पैटर्न तीर्थयात्रा पर लागू होते हैं।

hकमांड बफ़र की पिछली सामग्री को नष्ट कर देता है। यह हमेशा स्वीकार्य नहीं है, क्योंकि कभी-कभी हमें सामग्री को संरक्षित करने की आवश्यकता होती है। इस उद्देश्य के लिए, SED प्रदान करता हैHकमांड जो अंत में एक नई लाइन जोड़कर सामग्री को होल्ड बफर में जोड़ देती है। केवल अंतरh तथा Hकमांड है, पूर्व होल्ड होल्ड बफर से डेटा को अधिलेखित करता है, जबकि बाद में डेटा को होल्ड बफर में जोड़ता है। इसका वाक्य-विन्यास समान हैh आदेश।

[address1[,address2]]H

एक और उदाहरण लेते हैं। इस बार, केवल पुस्तक के शीर्षक छापने के बजाय, उनके लेखकों के नाम भी छापें। निम्नलिखित उदाहरण पुस्तक के शीर्षक को उनके लेखक के नाम से छापते हैं।

[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलता है:

The Alchemist 
Paulo Coelho 
The Pilgrimage
Paulo Coelho

हमने सीखा कि कैसे बफर को पकड़ने के लिए पैटर्न बफर की सामग्री को कॉपी / अपेंड करें। क्या हम रिवर्स फ़ंक्शन भी कर सकते हैं? हां बेशक! इस उद्देश्य के लिए, SED प्रदान करता हैgकमांड जो डाटा को होल्ड बफर से पैटर्न बफर में कॉपी करता है। कॉपी करते समय, पैटर्न स्पेस का मौजूदा डेटा ओवरराइट हो जाता है। नीचे दिए गए का सिंटैक्स हैg आदेश।

[address1[,address2]]g

आइए एक ही उदाहरण पर विचार करें - पुस्तक के शीर्षक और उनके लेखकों को मुद्रित करना। इस बार, हम पहले लेखक का नाम और उसके बाद अगली पंक्ति में, इसी पुस्तक का शीर्षक छापेंगे। निम्नलिखित कमांड लेखक पाउलो कोएलो के नाम को प्रिंट करता है, इसके बाद इसका पुस्तक शीर्षक है।

[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलता है:

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

पहली कमांड को वैसे ही रखा जाता है। पाँचवीं पास के अंत में, दोनों बफ़र्स में द अल्केमिस्ट शामिल हैं। छठे पास की शुरुआत में, यह लाइन पाउलो कोएल्हो को पढ़ता है और पैटर्न से मेल खाता है, यह इस लाइन को होल्ड बफर में कॉपी नहीं करता है। इसलिए, पैटर्न स्पेस मेंPaulo Coelho और होल्ड स्पेस में अल्केमिस्ट होता है।

इसके बाद, यह जाँच करता है कि पैटर्न स्पेस में पैटर्न पाउलो शामिल है या नहीं। जैसा कि पैटर्न मैच सफल होता है, यह पहले पैटर्न स्पेस की सामग्री को प्रिंट करता है, अर्थात, पाउलो कोएलो, फिर यह पैटर्न बफर को होल्ड बफर कॉपी करता है। इसलिए, दोनों पैटर्न और होल्ड बफ़र्स में अल्केमिस्ट शामिल हैं। अंत में, यह पैटर्न बफर की सामग्री को प्रिंट करता है। एक ही कदम पैटर्न तीर्थयात्रा पर लागू होते हैं।

इसी प्रकार, हम होल्ड बफर की सामग्री को पैटर्न बफर में जोड़ सकते हैं। SED प्रदान करता हैG कमांड जो अंत में एक नई लाइन जोड़कर पैटर्न बफर की सामग्री को जोड़ता है।

[address1[,address2]]G

अब हम पिछले उदाहरण को लेते हैं जो अपने पुस्तक शीर्षक से लेखक पाउलो कोएलहोफॉलो के नाम को छापता है। समान परिणाम प्राप्त करने के लिए, निम्नलिखित SED कमांड निष्पादित करें।

[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलता है:

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

क्या आप उनके लेखकों द्वारा पुस्तक के शीर्षक प्रदर्शित करने के लिए उपरोक्त उदाहरण को संशोधित कर सकते हैं? सरल, बस बफर सामग्री से पहले विनिमयG आदेश।

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलता है:

The Alchemist 
Paulo Coelho 
The Pilgrimage 
Paulo Coelho