इस तरह से बहु-वर्ण स्ट्रिंग्स के गैर-लालची मिलान को मजबूती से सेड का उपयोग करना है। यह कहते हैं कि आप इस इनपुट के लिए प्रत्येक 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