तीन अलग-अलग 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
थोड़ी देर के लिए किया गया है, ने \n
ewline वर्ण पर भरोसा करना सीख लिया होगा - क्योंकि एक को प्राप्त करने का एकमात्र तरीका स्पष्ट रूप से इसे वहां रखना है।
कार्रवाई करने से पहले जितना संभव हो उतना कम इनपुट में तीनों पढ़ने का प्रयास करते हैं - 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
इवलाइन या एक नई इनलाइन -e
xecution स्टेटमेंट के साथ एक लेबल की परिभाषा का परिसीमन करेगी ।
:n
- नाम के एक लेबल को परिभाषित करता है n
। इसे bn
या तो किसी भी समय वापस किया जा सकता है tn
।
tn
- t
एस्टीम कमांड एक निर्दिष्ट लेबल पर वापस लौटता है (या, यदि कोई भी प्रदान नहीं किया गया है, तो वर्तमान लाइन-चक्र के लिए स्क्रिप्ट कोs///
क्विट करता है ) यदि लेबल को परिभाषित किया गया था या जब से इसे अंतिम रूप से t
सफल कहा जाता था, तब से कोई भी ubsteration ।
इस कमांड में मिलान लाइनों के लिए पुनरावृत्ति होती है। यदि अन्यsed
पैटर्न के साथ पैटर्न को सफलतापूर्वक बदल दिया जाता है , तो लेबल पर वापस जाता है और फिर से कोशिश करता है। यदि एक ऑबस्ट्रेशन को ऑटोप्रीन्ट्स पैटर्न-स्पेस नहीं किया जाता है और अगली पंक्ति-चक्र शुरू होता है।sed
:n
s///
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 झंडा। समान इनपुट को देखते हुए यह कमांड अंतिम रूप से अनौपचारिक रूप से आउटपुट करता है।
\n
ewline बयान आप कर यही कारण है कि मैं पूछना। लोग शायद ही कभी पूछते हैं कि क्याs//\n/
आप GNU के साथ जैसा कर सकते हैंsed
, हालांकि अधिकांश दूसरेsed
लोग उस दाहिने हाथ की तरफ भागने को अस्वीकार कर देंगे। फिर भी,\n
पलायन किसी भी POSIX में बाईं ओर काम करेगाsed
और आप उन्हें आंशिक रूप से अनुवाद कर सकते हैं जैसेy/c/\n/
कि इसका प्रभाव उतना ही होगाs/c/\n/g
और इसलिए हमेशा उपयोगी नहीं होगा।