Sed का उपयोग करके स्ट्रिंग से टेक्स्ट कैसे निकालें?


95

मेरा उदाहरण स्ट्रिंग इस प्रकार है:

This is 02G05 a test string 20-Jul-2012

अब उपरोक्त स्ट्रिंग से मैं निकालना चाहता हूं 02G05। उसके लिए मैंने निम्नलिखित रीगेक्स को sed के साथ आज़माया

$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'

लेकिन उपरोक्त कमांड कुछ भी नहीं छापता है और मुझे लगता है कि इसका कारण यह है कि मैं उस पैटर्न के खिलाफ कुछ भी मिलान करने में सक्षम नहीं हूं जो मैंने sed को दिया था।

इसलिए, मेरा सवाल यह है कि मैं यहां क्या गलत कर रहा हूं और इसे कैसे सही करूं।

जब मैं अजगर के साथ उपरोक्त स्ट्रिंग और पैटर्न की कोशिश करता हूं तो मुझे अपना परिणाम मिलता है

>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>

6
अजगर निश्चित रूप से नहीं है sed। उनके रेगेक्स फ्लेवर काफी अलग हैं।
ट्रिपल डे

जवाबों:


91

पैटर्न \dआपके द्वारा समर्थित नहीं हो सकता है sed। कोशिश करो [0-9]या [[:digit:]]इसके बजाय।

केवल वास्तविक मिलान (संपूर्ण मिलान पंक्ति) प्रिंट करने के लिए, प्रतिस्थापन का उपयोग करें।

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

6
धन्यवाद यह ठीक काम किया। लेकिन मेरे पास एक सवाल है कि .*आपके regex के साथ क्यों आवश्यक है क्योंकि जब मैं कोशिश sed -n 's/\([0-9]\+G[0-9]\+\)/\1/p'करता हूं तो यह पूरी लाइन को प्रिंट करता है।
रणराग

7
यही कारण है, है ना? नॉरहिंग के साथ मैच से पहले और बाद में जो भी आता है उसे बदलें, फिर पूरी लाइन प्रिंट करें।
ट्रिपल

1
@tripleee यह केवल प्रिंट 2G05नहीं है 02G05। काम करने वाली अभिव्यक्ति है's/.*\([0-9][0-9]G[0-9][0-9]*\).*/\1/p'
क्षितिज शर्मा

1
यह मुश्किल से यह दो अंकों के लिए कोड है। कुछ sed -n 's/\(.*[^0-9]\)\?\([0-9][0-9]*G[0-9][0-9]*\).*/\2/p'और सामान्य होगा। (मुझे लगता है कि आपका sedसमर्थन \?शून्य या एक घटना के लिए है।)
ट्रिपल डि

यह भी देखें stackoverflow.com/a/48898886/874188 कैसे विभिन्न अन्य आम पर्ल की तरह निकल जाता है की जगह के लिए \w, \sआदि
tripleee

99

कैसे उपयोग के बारे में grep -E?

echo "This is 02G05 a test string 20-Jul-2012" | grep -Eo '[0-9]+G[0-9]+'

3
+1 यह सरल है, और एक ही लाइन पर कई मैचों के मामले को भी सही ढंग से हैंडल करेगा। sedउस मामले के लिए एक जटिल स्क्रिप्ट तैयार की जा सकती थी, लेकिन परेशान क्यों?
ट्रिपल जूल

egrepका उपयोग करता है बढ़ाया regexp, sedऔर grepमानक regexp का उपयोग करता है, egrepया grep -eया sed -Eविस्तारित regexp का उपयोग करें, और प्रश्न में अजगर कोड PCRE का उपयोग करता है, (आम नियमित अभिव्यक्ति पर्ल) जीएनयू ग्रेप साथ PCRE उपयोग कर सकते हैं -Pविकल्प।
फेलिप बुकेओनी

@FelipeBuccioni वास्तव में होना चाहिए कि egrepया grep -Eयाsed -r
SensorSmith

एकल (प्रथम) मैच के लिए, एपेंड करें `| हेड -1` (बैकटिक्स के बिना), इस प्रश्न के उत्तर के अनुसार ।
सेंसरस्मिथ

1
grepहै -m 1पहले मैच के बाद बंद करने के लिए।
त्रिपली २०'१

5

sed नहीं पहचानता \d , [[:digit:]]इसके बजाय का उपयोग करें । आपको स्विच ( ओएस एक्स पर) से बचने +या उपयोग करने की भी आवश्यकता होगी ।-r-E

ध्यान दें कि [0-9] अरबी-हिंदू अंकों के लिए भी काम करता है।


मैंने कोशिश की sed -n '/[0-9]\+G[0-9]\+/p'। अब यह पूरे स्ट्रिंग को प्रिंट करता है
RanRag

@ नोब: आपको उन हिस्सों को बाहर करने के लिए प्रतिस्थापन का उपयोग करने की आवश्यकता होगी जिन्हें आप प्रिंट नहीं करना चाहते हैं
अगली सूचना तक रोक दिया गया।

5

इसके बजाय यह प्रयास करें:

echo "This is 02G05 a test string 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*/\1/'

लेकिन ध्यान दें, यदि एक पंक्ति में दो पैटर्न हैं, तो यह 2 को प्रिंट करेगा।


या अधिक आम तौर पर पिछले एक अगर कई मैच हैं।
ट्रिपल

0

उपयोग करने का प्रयास rextract । यह आपको एक नियमित अभिव्यक्ति का उपयोग करके पाठ निकालने देगा और इसे पुन: स्वरूपित करेगा।

उदाहरण:

$ echo "This is 02G05 a test string 20-Jul-2012" | ./rextract '([\d]+G[\d]+)' '${1}'

2G05

यदि यह मानक रेगेक्स का उपयोग करता है, तो चारों ओर चौकोर कोष्ठक \dपूरी तरह से शानदार हैं।
त्रिवेणी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.