जवाबों:
"|" इसके विशेष अर्थ को प्राप्त करने के लिए भी एक बैकस्लैश की आवश्यकता है।
echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'
जो चाहोगे, करोगे।
जैसा कि आप जानते हैं, यदि अन्य सभी विफल होते हैं, तो मैन्युअल :-) पढ़ें।
GNU sed उपयोगकर्ता का मैनुअल , अनुभाग 3.3 नियमित अभिव्यक्ति सिंटैक्स का अवलोकन :
`REGEXP1 \ | REGEXP2 '
REGEXP1 या REGEXP2 से मेल खाता है।
नोट करें बैकस्लैश ...
दुर्भाग्य से, रेगेक्स सिंटैक्स वास्तव में मानकीकृत नहीं है ... कई वेरिएंट हैं, जो अन्य चीजों में भिन्न हैं जिनमें "विशेष वर्ण" की जरूरत है \ _ और जो नहीं करते हैं। कुछ में यह विन्यास योग्य है या स्विच पर निर्भर करता है (जैसे कि GNU में grep
, जिसे आप तीन अलग-अलग रीजैक्स बोलियों के बीच स्विच कर सकते हैं)।
विशेष रूप से यह उत्तर GNU सेड के लिए है । अन्य sed
प्रकार हैं, उदाहरण के लिए बीएसडी में इस्तेमाल किया जाने वाला, जो अलग तरह से व्यवहार करता है।
sed
वैकल्पिक का समर्थन करता है, लेकिन केवल "विस्तारित" रेगेक्स सिंटैक्स ( -E
) के साथ - जिसका अर्थ है कि पाइप या कोष्ठक पर कोई बैकस्लैश नहीं है:echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
चूंकि गैर-ग्नू sed
कार्यान्वयन के संबंध में कई टिप्पणियां हैं : कम से कम ओएस एक्स पर, आप -E
तर्क का उपयोग कर सकते हैं sed
:
बुनियादी नियमित अभिव्यक्तियों (BRE's) के बजाय नियमित अभिव्यक्तियों को विस्तारित (आधुनिक) नियमित अभिव्यक्तियों के रूप में व्याख्या करें। Re_format (7) मैनुअल पेज पूरी तरह से दोनों प्रारूपों का वर्णन करता है।
तो फिर आप नियमित अभिव्यक्ति रूपक का उपयोग कर सकते हैं उन्हें बचकर बिना। उदाहरण:
$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
blib bou
GNU sed भी -r
विकल्प का समर्थन करता है (नियमित भावों को विस्तारित)। इसका मतलब है कि आपको मेटाचैकर्स से बचने की ज़रूरत नहीं है:
echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"
आउटपुट:
hi hi
-r
विकल्प वास्तव में भावों की पठनीयता के लिए वास्तव में मददगार है। यही स्वीकृत उत्तर होना चाहिए।