ऐसा करने का पोर्टेबल तरीका - और अधिक कुशल तरीका - पते के साथ है। तुम यह केर सकते हो:
printf %s\\n cat dog pear banana cat dog |
sed -e '/cat/!{/dog/!b' -e '};cBear'
इस तरह से अगर लाइन में स्ट्रिंग कैट नहीं है और स्क्रिप्ट से बाहर स्ट्रिंग डॉग sed
b
रेक शामिल नहीं है , तो इसकी वर्तमान लाइन को ऑटोप्रीन करता है और अगले चक्र को शुरू करने के लिए अगले में खींचता है। इसलिए यह अगला निर्देश नहीं करता है - जो इस उदाहरण में भालूc
को पढ़ने के लिए पूरी रेखा को लटका देता है लेकिन यह कुछ भी कर सकता है।
यह शायद यह भी ध्यान देने योग्य है कि !b
उस sed
आदेश का पालन करने वाला कोई भी कथन केवल एक पंक्ति पर मेल खा सकता है जिसमें या तो स्ट्रिंग है dog
या cat
- तो आप बिना लाइन के मिलान के किसी भी खतरे के बिना आगे के परीक्षण कर सकते हैं - जिसका मतलब है कि आप अब नियम लागू कर सकते हैं केवल एक या दूसरे को।
लेकिन यह अगले है। यहाँ उपरोक्त कमांड से आउटपुट है:
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
आप बैकरेफ़रेन्स के साथ लुकअप टेबल को आंशिक रूप से लागू कर सकते हैं।
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ cat dog /;x
};G;s/^\(.*\)\n.* \1 .*/Bear/;P;d'
इस सरल उदाहरण मामले के लिए सेटअप करना बहुत अधिक काम है, लेकिन यह sed
लंबे समय में और अधिक लचीली स्क्रिप्ट के लिए बना सकता है।
पहली पंक्ति में मैं ई- x
होल्ड स्पेस और पैटर्न स्पेस को बदलता हूं और फिर उन्हें वापस बदलने से पहले स्ट्रिंग <space>
कैट <space>
डॉग<space>
को होल्ड स्पेस में सम्मिलित करता x
हूं।
तब से और हर निम्नलिखित लाइन पर मैं G
एट स्पेस को स्पेस स्पेस के साथ जोड़ देता हूं , फिर यह देखने के लिए जांचें कि क्या लाइन के शुरुआत से लेकर जब तक कि नई लाइन मैं अंत में जोड़े गए सभी वर्ण इसके बाद के स्थानों से घिरे स्ट्रिंग से मेल खाते हैं। यदि हां, तो मैं पूरे लॉट को भालू के साथ बदल देता हूं और यदि कोई नुकसान नहीं हुआ है, क्योंकि मैं अगले P
रिंट केवल पैटर्न स्पेस में पहली बार होने वाली न्यूलाइन तक करता हूं, फिर d
सभी इसे हटा दें।
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
और जब मैं लचीला बोलता हूं, तो मेरा मतलब है। यहाँ यह बदल रहा है बिल्ली के साथ BrownBear और कुत्ते के साथ BlackBear :
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ 1cat Brown 2dog Black /;x
};G;s/^\(.*\)\n.* [0-9]\1 \([^ ]*\) .*/\2Bear/;P;d'
###OUTPUT###
BrownBear
BlackBear
pear
banana
BrownBear
BlackBear
आप निश्चित रूप से लुकअप टेबल की सामग्री पर एक महान सौदे का विस्तार कर सकते हैं - मैंने इस विषय पर ग्रेग उबेन के यूनेट ईमेल से विचार उठाया , जब 90 के दशक में, उन्होंने बताया कि कैसे उन्होंने एक एकल sed s///
कथन से एक कच्चे कैलकुलेटर का निर्माण किया।
-r
विकल्प को-E
GNU sed के साथ अनुकूलता के पर्याय के रूप में समर्थन करते हैं । ओपनबीएसडी और ओएस एक्स कीsed -E
बची हुई पाइप की व्याख्या एक वैकल्पिक पाइप के रूप में होगी, न कि वैकल्पिक ऑपरेटर के रूप में। यहां नेटबीएसडी मैन पेज के लिए एक लिंक काम कर रहा है और यहां ओपनबीएसडी के लिए एक है जो दस साल पुराना नहीं है।