#begin command block
#append all lines between two addresses to hold space
sed -n -f - <<\SCRIPT file.xml
\|<tag1>|,\|</tag1>|{ H
#at last line of search block exchange hold and pattern space
\|</tag1>|{ x
#if not conditional ; clear buffer ; branch to script end
\|<tag2>[^<]*foo[^\n]*</tag2>|!{s/.*//;h;b}
#do work ; print result; clear buffer ; close blocks
s?*?*?;p;s/.*//;h;b}}
SCRIPT
यदि आप ऊपर दिए गए डेटा को देखते हैं, तो उस अंतिम सफाई लाइन से पहले, आपको एक sed
पैटर्न स्पेस के साथ काम करना चाहिए जो दिखता है:
^\n<tag1>\n<tag2>foo</tag2>\n</tag1>$
जब भी आपको l
ook पसंद हो आप अपना पैटर्न स्पेस प्रिंट कर सकते हैं । फिर आप \n
वर्णों पर पता कर सकते हैं ।
sed l <file
आपको दिखाएंगे कि प्रत्येक पंक्ति sed
इसे उस चरण में संसाधित करती l
है जिसे कहा जाता है।
इसलिए मैंने अभी इसका परीक्षण किया है और इसे पहली पंक्ति में एक के \backslash
बाद एक और अधिक की आवश्यकता है ,comma
, लेकिन अन्यथा के रूप में काम करता है। यहां मैंने इसे एक _sed_function
ऐसे स्थान पर रखा है जहां मैं इसे पूरे उत्तर में प्रदर्शन उद्देश्यों के लिए आसानी से कह सकता हूं: (इसमें शामिल टिप्पणियों के साथ काम करता है, लेकिन यहां संक्षिप्तता के लिए हटा दिया गया है)
_sed_function() { sed -n -f /dev/fd/3
} 3<<\SCRIPT <<\FILE
\|<tag1>|,\|</tag1>|{ H
\|</tag1>|{ x
\|<tag2>[^<]*foo[^\n]*</tag2>|!{s/.*//;h;b}
s?*?*?;p;s/.*//;h;b}}
#END
SCRIPT
<tag1>
<tag2>bar</tag2>
</tag1>
<tag1>
<tag2>foo</tag2>
</tag1>
FILE
_sed_function
#OUTPUT#
<tag1>
<tag2>foo</tag2>
</tag1>
अब हम स्विच करेंगे p
एक के लिए l
तो हम देख सकते हैं कि हम क्या के साथ के रूप में हम अपने स्क्रिप्ट को विकसित करने और गैर-सेशन डेमो को दूर काम कर रहे हैं s?
हमारे की अंतिम पंक्ति तो sed 3<<\SCRIPT
जैसे सिर्फ दिखता है:
l;s/.*//;h;b}}
तो मैं इसे फिर से चलाऊंगा:
_sed_function
#OUTPUT#
\n<tag1>\n <tag2>foo</tag2>\n</tag1>$
ठीक है! तो मैं सही था - यह एक अच्छा एहसास है। अब, आइए हमारे l
ook के चारों ओर फेरबदल करें, यह देखने के लिए कि यह किस रेखा को खींचता है लेकिन हटाता है। हम अपना करंट हटाएंगे l
और एक को जोड़ेंगे !{block}
ताकि ऐसा लगे:
!{l;s/.*//;h;b}
_sed_function
#OUTPUT#
\n<tag1>\n <tag2>bar</tag2>\n</tag1>$
इससे पहले कि हम इसे मिटा दें, यह कैसा दिखता है।
एक आखिरी चीज जो मैं आपको दिखाना चाहता हूं वह है H
पुरानी जगह जैसा कि हम इसे बनाते हैं। कुछ मुख्य अवधारणाएँ हैं, मुझे आशा है कि मैं प्रदर्शित कर सकता हूँ। इसलिए मैं l
फिर से अंतिम ook को हटाता हूं और H
अंत में पुरानी जगह में एक झलक जोड़ने के लिए पहली पंक्ति को बदलता हूं :
{ H ; x ; l ; x
_sed_function
#OUTPUT#
\n<tag1>$
\n<tag1>\n <tag2>bar</tag2>$
\n<tag1>\n <tag2>bar</tag2>\n</tag1>$
\n<tag1>$
\n<tag1>\n <tag2>foo</tag2>$
\n<tag1>\n <tag2>foo</tag2>\n</tag1>$
H
पुरानी जगह रेखा चक्र से बच जाती है - इसलिए नाम। तो क्या लोग अक्सर यात्रा करते हैं - ठीक है, जो मैं अक्सर यात्रा करता हूं - वह यह है कि इसका उपयोग करने के बाद इसे हटाने की आवश्यकता है। इस स्थिति में मैं केवल x
एक बार परिवर्तन करता हूं , इसलिए होल्ड स्पेस पैटर्न स्पेस और इसके विपरीत हो जाता है और यह परिवर्तन लाइन चक्रों से भी बच जाता है।
इसका प्रभाव यह है कि मुझे अपना होल्ड स्पेस हटाने की जरूरत है जो मेरा पैटर्न स्पेस हुआ करता था। मैं इसके साथ वर्तमान पैटर्न की जगह को पहले साफ कर रहा हूं:
s/.*//
जो बस हर चरित्र का चयन करता है और उसे हटा देता है। मैं उपयोग नहीं कर सकता d
क्योंकि इससे मेरी वर्तमान लाइन चक्र समाप्त हो जाएगा और अगली कमांड पूरी नहीं होगी, जो कि मेरी स्क्रिप्ट को बहुत अधिक कचरा कर देगी।
h
यह एक समान तरीके से काम करता है, H
लेकिन यह स्थान को अधिलेखित करता है, इसलिए मैंने अपने रिक्त स्थान के शीर्ष पर अपने रिक्त पैटर्न स्थान की प्रतिलिपि बनाई है, प्रभावी रूप से इसे हटा रहा है। अब मैं बस:
b
बाहर।
और इसी तरह मैं sed
स्क्रिप्ट लिखता हूं ।