2013-07-07 2 views
72

मैं पिछले दो नंबर हड़पने के लिए चाहते मिलान।sed: केवल और प्रिंट उन्हें (वैकल्पिक खाली स्थान के द्वारा पीछा किया एक पूर्णांक, एक नाव) प्रिंट केवल समूह

उदाहरण:

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' 

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

उत्तर

80

पूरी लाइन का मिलान करें, तो आपके regex की शुरुआत में एक .* जोड़ें। इस कारण पूरी पंक्ति समूह की सामग्री

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 
+24

मैं पर 's 'कमांड के आरएचएस ' त्रुटि \ 1 '-r' या' --regexp-extended' विकल्प अन्यथा मैं हो रही थी 'अमान्य संदर्भ जोड़ने के लिए किया था। –

+9

@DanielSokolowski मुझे लगता है कि यदि आप '(' और '\ '' के बजाय '(' और ')' का उपयोग करते हैं तो आपको वह त्रुटि मिलती है। –

+1

भी 'जोड़ना याद रखें।* 'regexp के अंत तक यदि आप जिस स्ट्रिंग को निकालना चाहते हैं वह हमेशा लाइन के अंत में नहीं है। –

45

ग्रेप निकालने के लिए सही उपकरण है के साथ प्रतिस्थापित किया।

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

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

@jozxyqk आपका मुद्दा है? पूरे समूह के लिए – Kent

+6

बहुत अच्छा है, हालांकि [अलग-अलग समूहों के लिए [sed की आवश्यकता है] (http://superuser.com/questions/11130/can-gnu-grep-output-a- चयनित- समूह) – jozxyqk

+0

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

7

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

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

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

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

0

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

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

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

-d सीमांकक

-f सेट, उत्पादन किया गया 'फ़ील्ड' की श्रेणी का चयन करता है इस मामले में यह है में मूल स्ट्रिंग के 6 वें से 7 वें भाग।

संबंधित मुद्दे