वैकल्पिक का उपयोग "|" sed के regex में


78

मैं sed, GNU sed संस्करण 4.2.1 का उपयोग कर रहा हूं। मैं विकल्प का उपयोग करना चाहता हूँ "|" एक सबडिप्रेशन में प्रतीक। उदाहरण के लिए :

echo "blia blib bou blf" | sed 's/bl\(ia|f\)//g'

लौट जाना चाहिए

" blib bou "

लेकिन यह लौटा

"blia blib bou blf".

मेरा अपेक्षित परिणाम कैसे हो सकता है?

जवाबों:


110

"|" इसके विशेष अर्थ को प्राप्त करने के लिए भी एक बैकस्लैश की आवश्यकता है।

echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'

जो चाहोगे, करोगे।

जैसा कि आप जानते हैं, यदि अन्य सभी विफल होते हैं, तो मैन्युअल :-) पढ़ें।

GNU sed उपयोगकर्ता का मैनुअल , अनुभाग 3.3 नियमित अभिव्यक्ति सिंटैक्स का अवलोकन :

`REGEXP1 \ | REGEXP2 '

REGEXP1 या REGEXP2 से मेल खाता है।

नोट करें बैकस्लैश ...

दुर्भाग्य से, रेगेक्स सिंटैक्स वास्तव में मानकीकृत नहीं है ... कई वेरिएंट हैं, जो अन्य चीजों में भिन्न हैं जिनमें "विशेष वर्ण" की जरूरत है \ _ और जो नहीं करते हैं। कुछ में यह विन्यास योग्य है या स्विच पर निर्भर करता है (जैसे कि GNU में grep, जिसे आप तीन अलग-अलग रीजैक्स बोलियों के बीच स्विच कर सकते हैं)।

विशेष रूप से यह उत्तर GNU सेड के लिए है । अन्य sedप्रकार हैं, उदाहरण के लिए बीएसडी में इस्तेमाल किया जाने वाला, जो अलग तरह से व्यवहार करता है।


35
किसी और के लिए इस जवाब से उलझन में \ | केवल ग्नू सेड में काम करता है (ओएस एक्स पर चला जाता है) वैनिला सेड में नहीं (ओएस एक्स पर सेड)।
एंड्रयू हैनॉक्स

@AndrewHancox बहुत बहुत धन्यवाद! मैं अपने सिर के सभी बालों को चीरने वाला था (और अब तक मैं बालों के मोर्चे पर अपने प्रबंधक की तुलना में बहुत अच्छा कर रहा हूं) - मुझे पता है कि मैं जानता हूं कि मैं कोशिश करने के लिए पर्याप्त हूं। और \ | लेकिन मैंने इस तथ्य के बारे में कभी नहीं सोचा कि OSX वास्तव में एक गैर-ग्नू सेड का उपयोग कर सकता है।
फस्त्स् फत

8
मानक बीएसडी / ओएस एक्स संस्करण sedवैकल्पिक का समर्थन करता है, लेकिन केवल "विस्तारित" रेगेक्स सिंटैक्स ( -E) के साथ - जिसका अर्थ है कि पाइप या कोष्ठक पर कोई बैकस्लैश नहीं है:echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
मार्क रीड ने

2
मैंने अपना उत्तर यह नोट करने के लिए संपादित किया कि यह केवल GNU sed के लिए है।
१०

22

चूंकि गैर-ग्नू sedकार्यान्वयन के संबंध में कई टिप्पणियां हैं : कम से कम ओएस एक्स पर, आप -Eतर्क का  उपयोग कर सकते हैं sed:

बुनियादी नियमित अभिव्यक्तियों (BRE's) के बजाय नियमित अभिव्यक्तियों को विस्तारित (आधुनिक) नियमित अभिव्यक्तियों के रूप में व्याख्या करें। Re_format (7) मैनुअल पेज पूरी तरह से दोनों प्रारूपों का वर्णन करता है।

तो फिर आप नियमित अभिव्यक्ति रूपक का उपयोग कर सकते हैं उन्हें बचकर बिना। उदाहरण:

$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
 blib bou 

12

GNU sed भी -rविकल्प का समर्थन करता है (नियमित भावों को विस्तारित)। इसका मतलब है कि आपको मेटाचैकर्स से बचने की ज़रूरत नहीं है:

echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"

आउटपुट:

hi hi

हां, -rविकल्प वास्तव में भावों की पठनीयता के लिए वास्तव में मददगार है। यही स्वीकृत उत्तर होना चाहिए।
рüффп

9

\|या तो Solaris 10 पर sed साथ काम नहीं करता। मैंने जो किया वह था

perl -p -e 's/bl(ia|f)//g'

2
+1 पोर्टेबिलिटी के बाद से, यदि सिस्टम में पर्ल है, तो यह हमेशा सेड के विपरीत, इस सिंटैक्स का उपयोग करेगा।
evilsoup

4

फॉलोअप: sed -E इसे MacOS पर अनुमति देता है। कोई बैकस्लैश की जरूरत नहीं है |

 sed -E 's/this|orthat/oooo/g' infile

1

Windows पर GnuWin32 में सिंटैक्स है sed "s/thing1\|thing2/ /g" source > destination

उद्धरण प्रकार का होना चाहिए "- यह "आवश्यक" है ताकि कमांड को पार्स किया जा सके।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.