उनके सहित दो पैटर्न के बीच पहली घटना का चयन कैसे करें


27

मैं उनके सहित दो पैटर्न के बीच पहली घटना का चयन कैसे कर सकता हूं। अधिमानतः का उपयोग कर sedया awk

मेरे पास है:

text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text

मैं पी 1 और पी 2 और पी 1 लाइन और पी 2 लाइन के बीच की लाइनों की पहली घटना चाहता हूं:

something P1 something
content1
content2
something P2 something

जवाबों:


22
sed '/P1/,/P2/!d;/P2/q'

... dसभी लाइनों को सीमित करके काम को आंशिक रूप से करना होगा जो !सीमा के भीतर नहीं आते हैं, फिर qपहली बार यह सीमा के अंत का सामना करते हुए। यह पी 2 पूर्ववर्ती पी 1 के लिए विफल नहीं होता है, और इसे बस लिखने के लिए जीएनयू विशिष्ट सिंटैक्स की आवश्यकता नहीं होती है।


अति उत्कृष्ट! मेरे से बहुत बेहतर।
मूरू

1
@ एमुरु - यदि आप ऑटोप्रिंट को लक्षित करने की कोशिश करते हैं, तो गर्भनिरोधक से बचना आसान है - चक्र को आपके लिए काम करने दें। वैसे भी मेरी आदत है। मुझे लगता है कि यह संभवतः एक चुनिंदा विधि के रूप में एक prune के रूप में सबसे अच्छा वर्णित है - मैं इसे खोजने के बजाय एक पैटर्न को नकारने के लिए हवा देता हूं।
मिकसेर

विशाल फ़ाइल संसाधित करते समय यह लटका दिया जाएगा।
ब्रेन 90

@ ब्रेन 90 - नहीं होना चाहिए। यदि आप मज़बूती से अपनी शिकायत को पुन: प्रस्तुत कर सकते हैं, तो आपको अपने अनुरक्षक को संबोधित करना चाहिए sed... आपके पास sedचल रहे बग में एक बग है , और ऊपर tbe स्क्रिप्ट में नहीं है।
mikeserv

1
अगर मैं नहीं होता तो @mikeserv ने यह नहीं कहा होता। कुछ पात्रों के बारे में मुझे परवाह है या नहीं, इस पर आपकी चिंता अजीब है: मैंने देखा कि /P2/qमेरे सिस्टम पर और उसके बिना दोनों के साथ काम करने वाले सेड एक्सप्रेशन ने काम किया ; बस। मैं किसी चीज को लेकर उत्सुक था और जो मुझे मिला उसे साझा करना चाहता था।
Alexej मगुरा

8

साथ में awk

awk '/P1/{a=1};a;/P2/{exit}' file
something P1 something
content1
content2
something P2 something

8

इन sed:

sed -n '/P1/,/P2/p; /P2/q'
  • -nडिफ़ॉल्ट मुद्रण को दबा देता है, और आप pकमांड का उपयोग करके मिलान पते के बीच की रेखाएं प्रिंट करते हैं ।
  • आम तौर पर यह दोनों वर्गों से मेल खाता होगा, इसलिए आपने qपहले P2मैच के दौरान ( ) छोड़ दिया ।

इससे P2पहले अगर कोई आता है तो यह फेल हो जाएगा P1। उस मामले को संभालने के लिए, प्रयास करें:

sed -n '/P1/,/P2/{p; /P2/q}'

1
मैं असहमत हूं; mikeserv का जवाब आपसे बेहतर कोई नहीं है।
जी-मैन ने कहा कि 'बहाली मोनिका'

@ जी-मैन - pshaw। लेकिन मैं बस एक ही बात सोच रहा था।
mikeserv

1
@ गमन - nope। अब मैं समझ गया। खानों का रास्ता बेहतर है। नहीं {ढेर}!
mikeserv

1

यदि आप स्वयं पैटर्न को छोड़ना चाहते हैं, तो यहां awkसंस्करण है:

awk '/P2/ {exit} /P1/ {f=1; next} f' file

मेरे लिये कार्य करता है। क्या आप इस बारे में कुछ और जानकारी जोड़ सकते हैं कि कमांड कैसे काम करता है?
0xAffe

1

एक सरल awk(के बीच आधे रास्ते तरह-का समाधान इरुवर के जवाब और  muru का जवाब है, लेकिन एक चर का उपयोग नहीं):

awk '/P1/,/P2/ { print }  /P2/ { exit }'

और, जैसा कि मुरू ने उल्लेख किया है, यदि पहला पी 2 पहले पी 1 से पहले दिखाई देता है, तो यह कुछ भी नहीं छापेगा।

बेशक, यदि आप सभी P1-P2 रेंज प्रिंट करना चाहते हैं:

something P1 something
content1
content2
something P2 something
something P1 something
content3
content4
something P2 something

बस exitभाग छोड़ दो :

awk '/P1/,/P2/ { print }'

1
awk '/P1/,/P2/{print;f=1} f&&/P2/{exit}' data

प्रिंट के तुरंत बाद छोड़ें, इससे पहले नहीं।


0

स्वयं पैटर्न को छोड़ें, और एकल GNU sed में केवल पहला मिलान ब्लॉक दिखाएँ:

sed -nre '/STARTPATTERN/ {:a;n;/ENDPATTERN/{b;};p;ba}' file
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.