कई लाइनों पर एक वाक्य के माध्यम से एसईडी विकल्प


11

मैं sed का उपयोग करने के लिए नया हूं लेकिन मैं s/..../..../एक वाक्य पर पूर्ण वाक्य को संशोधित करने के लिए sed (स्थानापन्न) का प्रयोग कर रहा हूं यदि यह एक पंक्ति पर है, लेकिन मैं एक वैकल्पिक समाधान से अनजान हूं कि एक वाक्य को कैसे संशोधित किया जाए जो दो लाइनों पर अलग हो सकता है जैसे:

यह:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

वास्तव में इस रूप में लिखा गया है:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.

आप इसके लिए कैसे पता लगा सकते हैं या पूरे वाक्य को बदलने के लिए इसे कोड कर सकते हैं भले ही यह एक के बजाय दो पंक्तियों पर हो?


ग्रेट सेड संदर्भ पुस्तक: डेनियल ए गोल्डमैन आईएसबीएन द्वारा सीड ट्यूटोरियल और संदर्भ के लिए निश्चित गाइड आईएसबीएन: 978-1-939824-01-1 (ईपीयूबी संस्करण) 08148804441822
जो

जवाबों:


16

निम्नलिखित आदेश दोनों स्थितियों में काम करेंगे:

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename

अधिक स्पष्टीकरण: मैं एक बहु-पंक्ति स्ट्रिंग को बदलने के लिए sed का उपयोग कैसे कर सकता हूं?


3
@ मुझे आपके अच्छे इरादे समझ में आते हैं, लेकिन कृपया मेरे उत्तर को गड़बड़ाने से पहले परीक्षण करने का प्रयास करें। बेहतर है, यदि आपके पास एक और राय है, तो एक और उत्तर जोड़ना या एक टिप्पणी छोड़ना है।
रादु राईडेनु


@Gilles कृपया, आपको शरारती होने की आवश्यकता नहीं है। आपको यह भी ध्यान देना चाहिए कि आपका "कोड" बिल्कुल कुछ भी नहीं है । जैसा कि मैंने कहा, मैं आपके अच्छे इरादों को समझता हूं। मेरे उदाहरण से मुझे लगता है कि ओपी को समझने के लिए कि कैसे कई लाइनों पर एक वाक्य के माध्यम से विकल्प दिया जाए sed, इससे ज्यादा कुछ नहीं। और यह शीर्षक प्रश्न है। शीर्षक के बारे में नहीं है perl
रादु राईडेनु

नहीं, मैंने जो कोड पोस्ट किया है वह काम करता है। (सिवाय अगर Loremअंतिम पंक्ति पर है, एक दोष यह अपने संस्करण के साथ साझा करता है।)
गाइल्स 'तथाकथित बंद किया जा रहा बुराई'

यह उदाहरण तब काम नहीं कर रहा है जब पाठ की 3 या अधिक पंक्तियाँ हैं :(
artnikpro

12

जबकि sed कई लाइनों पर पैटर्न का मिलान कर सकता है (आदेशों का उपयोग करके Nया Hमिलान करने से पहले क्रमिक रेखाओं को जोड़ने के लिए), यह अच्छी तरह से इसके आराम क्षेत्र के बाहर है। अगर आपको दर्द पसंद है तो ही इसे करने का प्रयास करें।

पर्ल इस तरह की चीजों को अच्छी तरह से कर सकते हैं। एक समय में मानक इनपुट एक रिकॉर्ड बनाने के लिए -pस्विच का उपयोग करें और संशोधित रिकॉर्ड (ए ला सिड) प्रिंट करें, और -000पैरा मोड चालू करें (जहां रिकॉर्ड रिक्त लाइनों द्वारा अलग किए गए हैं)। एक नियमित अभिव्यक्ति में, \sएक नई पंक्ति सहित किसी भी व्हाट्सएप चरित्र से मेल खाता है।

perl -p -000 -e 's/Lorem\s+Ipsum\s+is\s+simply\s+dummy\s+text\s+of\s+the\s+printing\s+and\s+typesetting\s+industry\./Replacement text/g'

यदि आप मूल के एक होने पर प्रतिस्थापन पाठ में एक नई पंक्ति डालना चाहते हैं, तो यह अधिक जटिल है। यह कैसे करना है यह आपकी आवश्यकताओं पर निर्भर करता है कि न्यूलाइन कहां रखी जाए।


@terdon आह, मेरा मतलब कई व्हाट्सएप को अनुमति देना था लेकिन भूल गए। धन्यवाद, निश्चित।
गिलेस एसओ- बुराई को रोकना '

सवाल के बारे में है sed। इसके साथ भी टैग किया गया है sed, साथ नहीं perl
रादु राईडेनू

0

sed आसानी से कई लाइनों में नहीं पढ़ सकता है। perl -i -0pe 's/.../.../...'इसके बजाय उपयोग करें ।


7
sed कई लाइनों में पढ़ सकता है !
राडू राईडेनू

3
@ RaduRădeanu तकनीकी रूप से, हाँ। लेकिन यह मुश्किल से लायक है।
गिलेस एसओ- बुराई को रोकना '

3
@ गिल्स यदि आपके लिए उपयोग perlकरना अधिक सरल है, तो इसका मतलब यह नहीं है कि sedशायद ही कभी परेशानी के लायक हो।
रादु राईडेनु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.