इस तरह से बहु-वर्ण स्ट्रिंग्स के गैर-लालची मिलान को मजबूती से सेड का उपयोग करना है। यह कहते हैं कि आप इस इनपुट के लिए प्रत्येक foo...bar
को बदलना चाहते हैं <foo...bar>
:
$ cat file
ABC foo DEF bar GHI foo KLM bar NOP foo QRS bar TUV
यह आउटपुट बनना चाहिए:
ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV
ऐसा करने के लिए कि आप फू और बार को अलग-अलग वर्णों में परिवर्तित करते हैं और फिर उन वर्णों की उपेक्षा का उपयोग करते हैं:
$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/foo/{/g; s/bar/}/g; s/{[^{}]*}/<&>/g; s/}/bar/g; s/{/foo/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV
ऊपरोक्त में:
s/@/@A/g; s/{/@B/g; s/}/@C/g
परिवर्तित हो रहा है {
और }
प्लेसहोल्डर स्ट्रिंग्स जो इनपुट में मौजूद नहीं हो सकते हैं, इसलिए उन वर्णों को तब कनवर्ट करने foo
और उपलब्ध करने के लिए उपलब्ध हैं bar
।
s/foo/{/g; s/bar/}/g
परिवर्तित foo
और bar
करने के लिए {
और }
क्रमशः
s/{[^{}]*}/<&>/g
हम चाहते हैं कि ऑप प्रदर्शन कर रहा है - करने के foo...bar
लिए परिवर्तित<foo...bar>
s/}/bar/g; s/{/foo/g
परिवर्तित कर रहा है {
और }
वापस करने के लिए foo
औरbar
।
s/@C/}/g; s/@B/{/g; s/@A/@/g
प्लेसहोल्डर स्ट्रिंग्स को उनके मूल वर्णों में परिवर्तित कर रहा है।
ध्यान दें कि उपरोक्त किसी विशेष स्ट्रिंग पर निर्भर नहीं करता है जो इनपुट में मौजूद नहीं है क्योंकि यह पहले चरण में इस तरह के तार का निर्माण करता है, और न ही यह ध्यान रखता है कि किसी भी विशेष रेगेक्स की घटना जो आप मेल खाना चाहते हैं क्योंकि आप {[^{}]*}
जितनी बार चाहें उपयोग कर सकते हैं अभिव्यक्ति को वास्तविक मैच से अलग करने के लिए जिसे आप चाहते हैं और / या sed सांख्यिक मिलान ऑपरेटर के साथ, उदाहरण के लिए केवल दूसरी घटना को प्रतिस्थापित करें:
$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/foo/{/g; s/bar/}/g; s/{[^{}]*}/<&>/2; s/}/bar/g; s/{/foo/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
ABC foo DEF bar GHI <foo KLM bar> NOP foo QRS bar TUV