2013-05-20 9 views
7

कृपया मुझे sed का उपयोग करने में मदद करें। मेरे पास एक फ़ाइल है जैसे नीचे।दो तारों के बीच पाठ निकालने के लिए

START=A 
    xxxxx 
    xxxxx 
END 
START=A 
    xxxxx 
    xxxxx 
END 
START=A 
    xxxxx 
    xxxxx 
END 
START=B 
    xxxxx 
    xxxxx 
END 
START=A 
    xxxxx 
    xxxxx 
END 
START=C 
    xxxxx 
    xxxxx 
END 
START=A 
    xxxxx 
    xxxxx 
END 
START=D 
    xxxxx 
    xxxxx 
END 

मैं START = A, END के बीच टेक्स्ट प्राप्त करना चाहता हूं। मैंने नीचे दी गई क्वेरी का उपयोग किया।

sed '/^START=A/,/^END/!d' input_file 

समस्या यहाँ है, मैं

START=A 
    xxxxx 
    xxxxx 
END 

Sed लालच से पाता है के बजाय

START=A 
    xxxxx 
    xxxxx 
END 
START=D 
    xxxxx 
    xxxxx 
END 

हो रही है।

कृपया इसे हल करने में मेरी सहायता करें।

अग्रिम धन्यवाद।

क्या मैं ऊपर प्राप्त करने के लिए एडब्ल्यूके का उपयोग कर सकता हूं?

उत्तर

19
sed -n '/^START=A$/,/^END$/p' data 

-n विकल्प का मतलब है डिफ़ॉल्ट रूप से मुद्रित नहीं है, तो स्क्रिप्ट कहती है 'START=A और अगले END वाली रेखा के बीच प्रिंट करें।

तुम भी awk साथ यह कर सकते हैं:

एक पैटर्न अल्पविराम से अलग दो पैटर्न शामिल हो सकते हैं; इस मामले में, कार्रवाई को के लिए पहले पैटर्न की घटना से दूसरी पंक्तियों की घटना के बाद किया जाता है।

(मैक ओएस एक्स पर man awk से)।

awk '/^START=A$/,/^END$/ { print }' data 

प्रश्न में डेटा फ़ाइल का एक संशोधित रूप को देखते हुए:

START=A 
    xxx01 
    xxx02 
END 
START=A 
    xxx03 
    xxx04 
END 
START=A 
    xxx05 
    xxx06 
END 
START=B 
    xxx07 
    xxx08 
END 
START=A 
    xxx09 
    xxx10 
END 
START=C 
    xxx11 
    xxx12 
END 
START=A 
    xxx13 
    xxx14 
END 
START=D 
    xxx15 
    xxx16 
END 

उत्पादन जीएनयू sed या मैक ओएस एक्स (BSD) sed, का उपयोग करते हुए और GNU awk या बीएसडी awk का उपयोग कर, है वही:

START=A 
    xxx01 
    xxx02 
END 
START=A 
    xxx03 
    xxx04 
END 
START=A 
    xxx05 
    xxx06 
END 
START=A 
    xxx09 
    xxx10 
END 
START=A 
    xxx13 
    xxx14 
END 

ध्यान दें कि मैंने डेटा फ़ाइल को कैसे संशोधित किया है, इसलिए यह देखना आसान है कि डेटा के विभिन्न ब्लॉक कहाँ मुद्रित हैं मुझे फाइल में से।

यदि आपके पास एक अलग आउटपुट आवश्यकता है (जैसे 'केवल START = ए और ईएनडी' या 'केवल अंतिम ...' के बीच पहला ब्लॉक, तो आपको प्रश्न में अधिक स्पष्ट रूप से स्पष्ट करने की आवश्यकता है।

+1

उत्तर के लिए धन्यवाद। मुझे START = A और अगले END के बीच टेक्स्ट चाहिए, उपरोक्त एक START = A और अंतिम END के बीच डेटा देता है। आशा है कि आपको मेरी जांच मिल जाएगी। – ranganath111

+0

नहीं, यह नहीं है। 'Awk' और 'sed' स्क्रिप्ट्स - कम से कम मेरी मशीन पर आपके द्वारा प्रदान की गई डेटा फ़ाइल की प्रतिलिपि के साथ -' START = A' और 'END' के बीच डेटा के 5 ब्लॉक प्रिंट करें, और' START = बी 'से' END', 'START = C' से 'END' और' START = D' से 'END' आउटपुट से सभी को छोड़ दिया गया है। आप किस प्लेटफॉर्म पर परीक्षण कर रहे हैं? आप 'sed' का किस संस्करण का उपयोग कर रहे हैं? आप किस 'awk' का उपयोग कर रहे हैं? (मुझे लगता है कि आपका टेस्ट डेटा 'START = A' और' END' के बीच वाले ब्लॉक को क्रियान्वित करता है। यदि आपके बीच अलग-अलग लाइनें हों तो यह बेहतर होगा ताकि आप देख सकें कि कौन सी लाइनें मुद्रित की जा रही हैं।) –

+0

जब मैं इसका परीक्षण करता हूं , स्टार्ट एंड एंड टोक आउटपुट में शामिल हैं, जबकि मुझे लगता था कि ओपी केवल उनके बीच डेटा चाहता था। –

2

आपकी sed अभिव्यक्ति के अंत से पहले एक स्थान है, i.e / ^END/। तो sed प्रारंभिक पैटर्न प्राप्त करता है, लेकिन अंतिम पैटर्न नहीं मिलता है और अंत तक प्रिंटिंग पर रहता है। sed '/^START=A/, /^END/!d' input_file का उपयोग करें (नोटिस /^END/)

+0

'sed' regex में स्थान के बारे में अच्छा बिंदु, हालांकि यह उद्धृत आउटपुट को और भी परेशान करता है (जैसा कि' मैं पुन: पेश नहीं कर सकता मूल लिपि के साथ आउटपुट उद्धृत, लेकिन अपर्याप्त स्थान छोड़ दें और यह ठीक काम करता है, यद्यपि cackhanded ')। आप अपनी 'awk' स्क्रिप्ट के अंतिम भाग को'/END/{flag = 0} 'तक कम से कम सरल बना सकते हैं, जो पहले से शून्य होने पर ध्वज को शून्य पर सेट कर सकता है, लेकिन इससे कोई नुकसान नहीं होता है। आप '/ START = ए /,/ईएनडी/{प्रिंट} 'का भी उपयोग कर सकते हैं जो कि बहुत आसान है। –

+0

हाँ, '/ START = ए /,/ईएनडी/{प्रिंट} 'यह बहुत आसान है, लेकिन यह पहले से ही आपके उत्तर में दिखाया गया है :) मैं सिर्फ ध्वज के साथ खेल रहा था :)। असल में, आपके द्वारा दिए गए 'अजीब' समाधान के बाद, उसे कुछ और करने की आवश्यकता नहीं है। मैं अपना 'अजीब' समाधान हटा दूंगा। यह किसी भी अच्छे काम करने से ज्यादा भ्रम पैदा कर सकता है: पी – abasu

+0

हाँ .. मुझे यह मिल गया है .. बहुत धन्यवाद – ranganath111

3

मूल संस्करण ...

sed -n '/START=A/,/END/p' yourfile 

अधिक मजबूत संस्करण ...

sed -n '/^ *START=A *$/,/^ *END *$/p' yourfile 
+0

क्या आप समझा सकते हैं कि ',' sed पैटर्न स्ट्रिंग में क्या है? –

+0

@ विक्रांत - ', 'दो रेगेक्स द्वारा परिभाषित * रेंज * के दो हिस्सों को अलग करता है ताकि पहले पैटर्न और दूसरे पैटर्न के बीच की रेखाएं लौटा दी जाए। – starfry

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