दो पैटर्न के बीच (और बाहर) प्रिंट लाइनें


13

मैं cURL का उपयोग करके फ़ॉर्म सबमिट करने जा रहा हूं, जहां कुछ सामग्री अन्य फ़ाइल से आती है, जिसका उपयोग करके चयन किया जाता है sed

यदि param1लाइन अन्य पैटर्न से मेल खाने वाले पैटर्न का उपयोग कर रही है sed, तो नीचे कमांड ठीक काम करेगी:

curl -d param1="$(sed -n '/matchpattern/p' file.txt)" -d param2=value2 http://example.com/submit

अब, समस्या पर जाएं। मैं केवल मिलान पैटर्न को छोड़कर 2 मिलान पैटर्न के बीच केवल पाठ दिखाना चाहता हूं।

कहते file.txtहैं कि इसमें शामिल हैं:

Bla bla bla
firstmatch
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
secondmatch
The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.

वर्तमान में, बहुत सारे "बीट्वीन 2 मैचिंग पैटर्न" sedकमांड हटाए नहीं जाएंगे firstmatchऔर secondmatch

मैं परिणाम बनना चाहता हूं:

It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.

जवाबों:


15

यहाँ एक तरीका है जो आप इसे कर सकते हैं:

sed '1,/firstmatch/d;/secondmatch/,$d' 

समझाया गया: पहली पंक्ति से पहली मिलान करने वाली रेखा तक , हटाएं। लाइन मिलान से secondmatch अंतिम पंक्ति के लिए, को हटा दें।


6

जाग में:

awk '
  $1 == "secondmatch" {print_me = 0}
  print_me {print}
  $1 == "firstmatch {print_me = 1}
'

यहाँ गति के बारे में: unix.stackexchange.com/a/194662/16920
Léo Léopold Hertz

गति के बारे में क्या?
बजे ग्लेन जैकमैन

मुझे लगता है कि SED यहां समय में AWK के विपरीत बेहतर है।
लेओ लेपोल्ड हर्ट्ज़ o 16

5

1 पंक्ति 1 पर होने पर अन्य sedसमाधान विफल हो जाएगा । firstmatch

इसे सरल रखें, एक सिंगल रेंज और एक खाली 2 रेगेक्स का उपयोग करें:
या तो रेंज रेंज (ऑटो-प्रिंटिंग डिसेबल 3 ) को छोड़कर उस रेंज में सब कुछ प्रिंट करें :

sed -n '/firstmatch/,/secondmatch/{//!p;}' infile

या कम, उस सीमा में सब कुछ नहीं हटाएं और सीमा समाप्त होने को भी हटा दें:

sed '/firstmatch/,/secondmatch/!d;//d' infile


1: इसका कारण यह है कि यदि दूसरा पता एक regexp है, तो समाप्त होने वाले मैच की जाँच उस रेखा से शुरू होगी जो पहले पते से मेल खाती है
इसलिए, /firstmatch/इनपुट की पहली पंक्ति के लिए कभी भी मूल्यांकन नहीं किया जाता है, sedबस इसे हटा देगा क्योंकि यह लाइन संख्या से मेल खाता है 1,/RE/और दूसरी पंक्ति पर आगे बढ़ता है जहां यह जाँच करता है कि क्या रेखा मेल खाती है/firstpattern/

2: जब कोई REGEX खाली होता है (यानी //) sedऐसा व्यवहार करता है जैसे कि लागू अंतिम कमांड में प्रयुक्त अंतिम रेजेक्स (या तो पते के रूप में या स्थानापन्न कमांड के भाग के रूप में) निर्दिष्ट किया गया हो।

3: ;}वाक्यविन्यास आधुनिक sedकार्यान्वयन के लिए है; पुराने के साथ अर्धविराम या अलग-अलग अभिव्यक्तियों जैसे उदाहरण के लिए या तो एक नई पंक्ति का उपयोग करेंsed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile


क्या आप बता सकते हैं कि क्या //कर रहा है (अंदर {…})?
जी-मैन 'मोनिका'

धन्यवाद, लेकिन आप मेरे जाल में गिर गए। मुझे पता है कि //इसका मतलब है कि अंतिम नियमित अभिव्यक्ति का उपयोग किया जाता है; मैंने जो कुछ भी पढ़ा है, वही होना चाहिए /secondmatch/। मैंने परीक्षण के माध्यम से सत्यापित किया है कि आपकी कमांड काम करती है, और इसलिए मैंने निष्कर्ष निकाला है कि यह /firstmatch|secondmatch/(जो आपने पुष्टि की है) के रूप में कार्य कर रहा है, लेकिन मुझे कोई दस्तावेज नहीं मिल सकता है ( पोसिक्स दस्तावेज़ भी नहीं जिसे आपने या जीएनयू से जोड़ा है। sed मैनुअल ) जो इस व्यवहार का वर्णन करता है। … (Cont'd)
G-Man कहते हैं मोनिका

(Cont'd)… मनोरंजक प्रयोग: (I) In sed: (1) यदि मैं करता हूं /first/,4, तो इस //तरह कार्य करता है /first/। (२) यदि मैं करता हूं 2,/second/, तो //"कोई पिछली नियमित अभिव्यक्ति नहीं" त्रुटि मिलती है। (मुझे यह निर्दिष्ट व्यवहार का पालन करने में एक असफल विफलता --posixलगती है ।) (3) जोड़ना उपरोक्त दोनों में से कोई भी परिवर्तन नहीं करता है। (II) अन्य कार्यक्रमों में: (4) में vi, के बाद /first/,/second/, //जैसे कार्य करता है /second/(और अन्य रूप भी दस्तावेज नियम के तर्कसंगत कार्यान्वयन हैं)। … (Cont'd)
G-Man कहते हैं मोनिका

(Cont'd) ... (5)  awk"अंतिम आरई इस्तेमाल किया" की कोई धारणा नहीं है; //किसी भी चरित्र से पहले या बाद में गैर-चरित्र को संदर्भित करता है। (मैं आपको कोशिश करने के लिए आमंत्रित करता हूं echo -- | awk '{ gsub(//, "cha"); print }'।)
जी-मैन का कहना है कि मोनिका '

तो, आप "अंतिम कमांड में अंतिम रेजेक्स का उपयोग करते हैं" को "अंतिम कमांड में प्रयुक्त अंतिम रेजेक्स (एस) के रूप में पढ़ते हैं" और इसलिए आपने (सही ढंग से) अनुमान लगाया कि इसका मतलब था /first|second/। तुम भाग्यशाली हो। मैं अन्य कार्यक्रमों का उल्लेख करता हूं कि यह प्रदर्शित करने के लिए कुछ सिस्टम-वाइड रेगेक्स सम्मेलन नहीं है। जिसने भी इसे जोड़ा है वह इसे sedजोड़ने की जहमत नहीं उठाता vim, जहां यह सिर्फ उतना ही समझ में आता है। :
जी-मैन का कहना है कि मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.