क्या GNU Grep एक चयनित समूह का उत्पादन कर सकता है?


47

क्या एक अभिव्यक्ति से एक मिलान समूह प्राप्त करने के लिए GNU grep का उपयोग करना संभव है?

उदाहरण:

echo "foo 'bar'" | grep -oE "'([^']+)'"

जो "" बार '' को आउटपुट करेगा। लेकिन मैं सिर्फ "बार" प्राप्त करना चाहूंगा, बिना इसे एक बार के grep के माध्यम से भेजने के लिए (अर्थात। मिलान किया गया समूह)। क्या यह संभव है?

जवाबों:


50

आप इसके लिए उपयोग कर सकते हैं sed। बीएसडी पर sed:

echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"

या, -Eविकल्प के बिना :

sed "s/.*'\([^']\+\)'.*/\1/"

यह मल्टीलाइन इनपुट के लिए काम नहीं करता है। इसके लिए आपको चाहिए:

sed -n "s/.*'\([^']\+\)'.*/\1/p"

धन्यवाद, सेड के बारे में भूल गया था। लेकिन स्पष्ट करने के लिए, sed तर्क नहीं लेता है -E ..
टोरंडी

एचएम, यह मेरी मशीन (मैक ओएस एक्स) पर करता है। आगे की परीक्षा में, मैन पेज में: "The -E, in-andi विकल्प गैर-मानक FreeBSD एक्सटेंशन हैं और अन्य ऑपरेटिंग सिस्टम पर उपलब्ध नहीं हो सकते हैं।"
jtbandes

1
ऐसा लगता है कि मेरे लिए है।
तोरंडी

1
@jtbandes: आपको इस अभिव्यक्ति के लिए विस्तारित सुविधाओं की आवश्यकता नहीं है .. मुझे केवल ( ) +उपयोग के लिए 3 एस्केप पात्रों की आवश्यकता है \( \) \+: यह प्रभावी रूप से समान है:sed "s/.*'\([^']\+\)'.*/\1/"
पीटर।

2
यह मल्टीलाइन इनपुट के लिए काम नहीं करता है। इसके लिए आपको आवश्यकता है: sed -n "s/.*'\([^']\+\)'.*/\1/p"
१५

28

जबकि grep एक विशिष्ट समूह का उत्पादन नहीं कर सकता है, आप अपने बाद क्या प्राप्त करने के लिए लुकहेड और जोर के पीछे का उपयोग कर सकते हैं:

echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"


8
grep -Pसभी प्लेटफार्मों पर उपलब्ध नहीं है। लेकिन अगर यह है, तो लुकहेड / बैक का उपयोग समस्या को हल करने का एक बहुत अच्छा तरीका है।
सेबास्टियन

1
क्या grep दिखावे के साथ बुद्धिमान है? यह लंबे-लंबे लुक के साथ कैसा प्रदर्शन करता है? क्या यह रेगेक्स के बाकी हिस्सों के साथ "प्रत्यय वृक्ष" के कुछ प्रकारों में लुक-बिहाइंड को एकीकृत कर रहा है ?
रोस रोजर्स

3

आप \Kएक लुकहेड के साथ बाएं हाथ के मैच टेक्स्ट को रीसेट और त्यागने के लिए उपयोग कर सकते हैं, जो मैच टेक्स्ट में नहीं जोड़ा जाता है:

$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar

ग्नू ग्रीप ही।

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