तीन अलग-अलग sedकमांड:
sed '$!N;s/"[^"]*"\n<[^>]*>/other characters /;P;D'
sed -e :n -e '$!N;s/"[^"]*"\n<[^>]*>/other characters /;tn'
sed -e :n -e '$!N;/"$/{$!bn' -e '};s/"[^"]*"\n<[^>]*>/other characters /g'
वे तीनों बुनियादी s///सर्वहाराकरण आदेश पर निर्माण करते हैं :
s/"[^"]*"\n<[^>]*>/other characters /
वे सभी अंतिम पंक्ति के अपने संचालन में सावधानी बरतने की कोशिश sedकरते हैं , क्योंकि वे किनारे के मामलों में अपने आउटपुट पर भिन्न होते हैं। इसका अर्थ यह है $!कि हर पंक्ति से मेल खाता एक पता है !जो $अंतिम नहीं है ।
वे सभी Nएक \nएक्सलाइन चरित्र का अनुसरण करते हुए अगली इनपुट लाइन को पैटर्न स्पेस में जोड़ने के लिए एक्सट्रीम कमांड का भी उपयोग करते हैं । किसी को भी जो sedथोड़ी देर के लिए किया गया है, ने \newline वर्ण पर भरोसा करना सीख लिया होगा - क्योंकि एक को प्राप्त करने का एकमात्र तरीका स्पष्ट रूप से इसे वहां रखना है।
कार्रवाई करने से पहले जितना संभव हो उतना कम इनपुट में तीनों पढ़ने का प्रयास करते हैं - sedऐसा करने से पहले पूरी इनपुट फ़ाइल में पढ़ने की जरूरत नहीं है।
हालांकि वे सभी करते हैं N, वे तीनों अपने पुनरावृत्ति के तरीकों में भिन्न हैं।
पहले कमान
पहला आदेश एक बहुत ही सरल N;P;Dलूप को नियोजित करता है । ये तीन कमांड किसी भी POSIX- संगत के लिए अंतर्निहित हैं sedऔर वे एक दूसरे के पूरक हैं।
N- जैसा कि पहले ही उल्लेख किया गया है, Nएक सम्मिलित \nईवलाइन सीमांकक के बाद पैटर्न-स्पेस में एक्सट्रीम इनपुट लाइन को जोड़ता है।
P- जैसे p; यह Pपैटर्न-स्पेस का संकेत देता है - लेकिन केवल पहली होने वाली \nइलाइन वर्ण तक। और इसलिए, निम्नलिखित इनपुट / कमांड दिया गया है:
printf %s\\n one two | sed '$!N;P;d'
sed Pकेवल एक ही संकेत देता है । हालांकि, के साथ ...
D- जैसे d; यह Dपैटर्न-स्पेस को हटाता है और एक और लाइन-चक्र शुरू करता है। इसके विपरीत d , पैटर्न-स्पेस में Dकेवल पहली होने वाली \nईवलाइन तक ही डिलीट होती है। यदि \nईलाइन वर्ण के बाद पैटर्न-स्पेस में अधिक है , तो sedजो रहता है उसके साथ अगली पंक्ति चक्र शुरू होता है। यदि dपिछले उदाहरण में प्रतिस्थापित किया गया है D, उदाहरण के लिए, एक और दो दोनों sedको Pरिंट करेगा ।
यह कमांड केवल उन पंक्तियों के लिए पुनरावर्ती करता है जो ubsteration स्टेटमेंट से मेल नहीं खाती हैं s///। क्योंकि s///ऑब्स्ट्रेशन के \nसाथ जोड़ी गई ईवलाइन को हटा देता है N, sed Dईलेट्स पैटर्न-स्पेस होने पर कुछ भी शेष नहीं रहता है।
Pऔर / या Dचुनिंदा रूप से आवेदन करने के लिए टेस्ट किए जा सकते हैं , लेकिन अन्य कमांड हैं जो उस रणनीति के साथ बेहतर हैं। क्योंकि पुनरावृत्ति को लगातार लाइनों को संभालने के लिए लागू किया जाता है जो प्रतिस्थापन नियम के केवल एक हिस्से से मेल खाते हैं , ubsteration के दोनों सिरों से मेल खाती लाइनों के लगातार क्रम s///अच्छी तरह से काम नहीं करते हैं:
इस इनपुट को देखते हुए:
first "line"
<second>"line"
<second>"line"
<second>line and so on
... यह प्रिंट करता है ...
first other characters "line"
<second>other characters line and so on
हालांकि, यह संभालता है
first "line"
second "line"
<second>line
...बस ठीक।
दूसरी कमान
यह कमांड तीसरे के समान है। दोनों एक रेंच:b / tएस्ट लेबल लगाते हैं (जैसा कि जोसेफ आर के जवाब में यहां भी प्रदर्शित किया गया है ) और कुछ विशेष शर्तों के साथ इसे वापस लाते हैं।
-e :n -e- पोर्टेबल sedस्क्रिप्ट :या तो एक \nइवलाइन या एक नई इनलाइन -execution स्टेटमेंट के साथ एक लेबल की परिभाषा का परिसीमन करेगी ।
:n- नाम के एक लेबल को परिभाषित करता है n। इसे bnया तो किसी भी समय वापस किया जा सकता है tn।
tn- tएस्टीम कमांड एक निर्दिष्ट लेबल पर वापस लौटता है (या, यदि कोई भी प्रदान नहीं किया गया है, तो वर्तमान लाइन-चक्र के लिए स्क्रिप्ट कोs/// क्विट करता है ) यदि लेबल को परिभाषित किया गया था या जब से इसे अंतिम रूप से tसफल कहा जाता था, तब से कोई भी ubsteration ।
इस कमांड में मिलान लाइनों के लिए पुनरावृत्ति होती है। यदि अन्यsed पैटर्न के साथ पैटर्न को सफलतापूर्वक बदल दिया जाता है , तो लेबल पर वापस जाता है और फिर से कोशिश करता है। यदि एक ऑबस्ट्रेशन को ऑटोप्रीन्ट्स पैटर्न-स्पेस नहीं किया जाता है और अगली पंक्ति-चक्र शुरू होता है।sed:ns///sed
यह लगातार दृश्यों को बेहतर तरीके से संभालता है। जहां पिछले एक असफल रहा, यह प्रिंट:
first other characters other characters other characters line and so on
तीसरी आज्ञा
जैसा कि उल्लेख किया गया है, यहां तर्क अंतिम के समान है, लेकिन परीक्षण अधिक स्पष्ट है।
/"$/bn- यह sedपरीक्षा है। क्योंकि bरैंच कमांड इस पते का एक फ़ंक्शन है, sedकेवल एक ईवलाइन को जोड़ने के बाद ही bरैंच वापस आ जाएगा और पैटर्न-स्पेस अभी भी दोहरे-उद्धरण के साथ समाप्त होता है ।:n\n"
इस तरह के बीच Nऔर bजितना संभव हो उतना कम किया जाता है - इस तरह sedसे यह सुनिश्चित करने के लिए बहुत जल्दी इनपुट प्राप्त कर सकता है कि निम्नलिखित लाइन आपके नियम से मेल नहीं खा सकती है। s///Ubstitution में है कि यह रोजगार यहां अलग है gऔर इसलिए यह एक बार में सभी आवश्यक प्रतिस्थापन करना होगा - lobal झंडा। समान इनपुट को देखते हुए यह कमांड अंतिम रूप से अनौपचारिक रूप से आउटपुट करता है।
\newline बयान आप कर यही कारण है कि मैं पूछना। लोग शायद ही कभी पूछते हैं कि क्याs//\n/आप GNU के साथ जैसा कर सकते हैंsed, हालांकि अधिकांश दूसरेsedलोग उस दाहिने हाथ की तरफ भागने को अस्वीकार कर देंगे। फिर भी,\nपलायन किसी भी POSIX में बाईं ओर काम करेगाsedऔर आप उन्हें आंशिक रूप से अनुवाद कर सकते हैं जैसेy/c/\n/कि इसका प्रभाव उतना ही होगाs/c/\n/gऔर इसलिए हमेशा उपयोगी नहीं होगा।