sed: प्रिंट केवल मिलान समूह


133

मैं पिछले दो नंबरों को हथियाना चाहता हूं (एक इंट, एक फ्लोट; उसके बाद वैकल्पिक व्हाट्सएप) और केवल उन्हें प्रिंट करें।

उदाहरण:

foo bar <foo> bla 1 2 3.4

प्रिंट करना चाहिए:

2 3.4

अब तक, मेरे पास निम्नलिखित हैं:

sed -n  's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/replacement/p' 

मुझे दे देंगे

foo bar <foo> bla 1 replacement

हालाँकि, यदि मैं इसे समूह 1 के साथ बदलने का प्रयास करता हूँ, तो पूरी पंक्ति मुद्रित होती है।

sed -n  's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/\1/p' 

मैं केवल उस पंक्ति के अनुभाग को कैसे प्रिंट कर सकता हूं जो समूह में रेगेक्स से मेल खाता है?

जवाबों:


138

पूरी रेखा से मिलान करें, इसलिए .*अपने रेगेक्स की शुरुआत में जोड़ें । यह समूची पंक्ति को समूह की सामग्री से बदलने का कारण बनता है

echo "foo bar <foo> bla 1 2 3.4" |
 sed -n  's/.*\([0-9][0-9]*[\ \t][0-9.]*[ \t]*$\)/\1/p'
2 3.4

38
मुझे -rया- orgexx-Extended` विकल्प को जोड़ना था अन्यथा मुझे invalid reference \1 on कमांड की RHS `त्रुटि मिल रही थी ।
डैनियल सोकोलोस्की

15
@DanielSokolowski मुझे लगता है कि आप उस त्रुटि को प्राप्त करते हैं यदि आप उपयोग करते हैं (और )इसके बजाय \(और \)
डैनियल डारबोस

3
यह भी याद रखें .*कि यदि आप जिस स्ट्रिंग को निकालना चाहते हैं, उसे रेगेक्स के अंत में जोड़ना हमेशा पंक्ति के अंत में नहीं होता है।
तैमू लीस्तु

3
यह मेरे लिए काम नहीं करेगा क्योंकि .*लालची और .*?
सेड में

@DanielDarabos बस उल्लेख है कि (और )ubuntu 16.04 में त्रुटि नहीं बढ़ाएगा। इसलिए मुझे लगता है कि यह टिप्पणी पुरानी है।
ली हैनान

72

grep निकालने का सही उपकरण है।

अपने उदाहरण और अपने regex का उपयोग कर:

kent$  echo 'foo bar <foo> bla 1 2 3.4'|grep -o '[0-9][0-9]*[\ \t][0-9.]*[\ \t]*$'
2 3.4

12
पूरे समूह के लिए महान, हालांकि व्यक्तिगत समूहों के लिए sed की आवश्यकता है
jozxyqk

grep -o msysgit चलाने वाले सिस्टम पर पोर्ट नहीं करता है, लेकिन sed करता है।
cchamberlain

एक उत्तर के लिए @jozxyqk द्वारा लिंक किए गए प्रश्न को देखें जो इसे grep के साथ हल करने के लिए लुक-फ़ॉर और लुक-बैक का उपयोग करता है।
जोआचिम ब्रेटनर

आप पाइप्ड grep -oकॉल वाले पैटर्न से एक समूह को निकाल सकते हैं। stackoverflow.com/a/58314379/117471
ब्रूनो ब्रोंस्की

12

और अभी तक एक और विकल्प के लिए, मैं awk के साथ जाना होगा!

echo "foo bar <foo> bla 1 2 3.4" | awk '{ print $(NF-1), $NF; }'

यह इनपुट को विभाजित करेगा (मैं यहां STDIN का उपयोग कर रहा हूं, लेकिन रिक्त स्थान पर आपका इनपुट आसानी से एक फ़ाइल हो सकता है), और फिर अंतिम-लेकिन-एक फ़ील्ड और फिर अंतिम फ़ील्ड का प्रिंट आउट करें। $NFचर पकड़ फ़ील्ड की संख्या रिक्त स्थान पर विस्फोट के बाद पाया।

इसका लाभ यह है कि इससे कोई फर्क नहीं पड़ता कि पिछले दो क्षेत्रों में क्या बदलाव आता है, जब तक आप केवल पिछले दो को चाहते हैं यह काम करना जारी रखेगा।


3

कट कमांड को इस सटीक स्थिति के लिए डिज़ाइन किया गया है। यह किसी भी सीमांकक पर "कट" करेगा और फिर आप निर्दिष्ट कर सकते हैं कि कौन सा हिस्सा आउटपुट होना चाहिए।

उदाहरण के लिए: echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7

के उत्पादन में परिणाम होगा: 2 3.4

-d सीमांकक सेट करता है

-यदि उत्पादन के लिए 'फ़ील्ड्स' की सीमा का चयन करता है, तो इस मामले में, मूल स्ट्रिंग के 7 वें भाग से यह 6 वाँ है। आप एक सूची के रूप में सीमा भी निर्दिष्ट कर सकते हैं, जैसे कि 6,7


केवल कुछ स्तंभों को प्रिंट करने के लिए, awk '{ print $2" "$6 }'
बजे

@nurettin मुझे लगता है कि आपकी टिप्पणी शायद किसी एक के लिए थी।
carlin.scott

जब मैंने इस पृष्ठ का दौरा किया तो मैंने कटौती की कोशिश की और इसकी सीमाओं को महसूस किया और इस पोस्ट की गुणवत्ता में सुधार करने के लिए एक टिप्पणी के रूप में awk में एक अधिक सामान्यीकृत संस्करण लिखने का फैसला किया।
नुरेटिन

1
हाँ, मुझे लगता है कि awk को शामिल करने वाले एक अलग उत्तर पर संबंधित है। जो आपने लिखा है उसे करने के लिए कट कमांड है:cut -d " " -f 2,6
carlin.scott

आह, मुझे नहीं पता था कि, मुझे लगा कि आप केवल रेंज दे सकते हैं। उसके लिए धन्यवाद।
नुरेटिन

2

मैं सहमत हूं @kent से हूं कि यह अच्छी तरह से अनुकूल है grep -o। यदि आपको एक पैटर्न के भीतर एक समूह को निकालने की आवश्यकता है, तो आप इसे 2 जीआरईपी के साथ कर सकते हैं।

# To extract \1 from /xx([0-9]+)yy/
$ echo "aa678bb xx123yy xx4yy aa42 aa9bb" | grep -Eo 'xx[0-9]+yy' | grep -Eo '[0-9]+'
123
4

# To extract \1 from /a([0-9]+)b/
$ echo "aa678bb xx123yy xx4yy aa42 aa9bb" | grep -Eo 'a[0-9]+b' | grep -Eo '[0-9]+'
678
9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.