मैं एक पैटर्न से सब कुछ और एक लाइन से दूसरे पैटर्न के बाद सब कुछ कैसे हटा सकता हूं?


17

निम्नलिखित फ़ाइल में:

लोरम इप्सम डोलर अमेट, कंसेटेटुर एडिपिसिंग एलीट। यूट यू मेटस आईडी लेक्टस वेस्टिबुलम अल्ट्रिसेस। मेकेनस रोनकस।

मैं पहले consectetuerऔर सब कुछ के बाद सब कुछ हटाना चाहता हूं elit

मेरा वांछित आउटपुट:

consectetuer adipiscing elit.

मैं यह कैसे कर सकता हूँ?


2
आज्ञा हो सकती है sed। यह perlशुद्ध बैश भी हो सकता है ।
मूरू

@manuel यदि इनमें से किसी एक उत्तर ने आपकी समस्या हल कर दी है, तो कृपया एक क्षण लें और बाईं ओर चेक मार्क पर क्लिक करके इसे स्वीकार करें। यह प्रश्न के उत्तर के रूप में चिह्नित करेगा और स्टैक एक्सचेंज साइटों पर धन्यवाद व्यक्त करने का तरीका है।
terdon

जवाबों:


28

मैं sed का उपयोग करता हूँ

sed 's/^.*\(consectetuer.*elit\).*$/\1/' file

सीडकोड को डीकोड / सिस्टैक्स / बदलें / बदलें:

  • s/^.*- लाइन की शुरुआत में स्थानापन्न ( ^) कुछ भी ( .*) के बाद ...
  • \( - एक नामित ब्लॉक शुरू करें
  • consectetuer.*elit\.- .*अंतिम शब्द तक पहले शब्द, सब कुछ ( ) का मिलान करें (इस मामले में, अनुगामी (बच गए) डॉट सहित) आप मिलान करना चाहते हैं
  • \) - नामित ब्लॉक को समाप्त करें
  • .*लाइन के अंत तक (बाकी सब कुछ ) मेल करें ( $)
  • / - स्थानापन्न खोज अनुभाग समाप्त करें
  • \1- ऊपर \(और \)ऊपर के बीच नाम ब्लॉक के साथ बदलें
  • / - प्रतिस्थापित समाप्त करें

1
अच्छा जवाब है, लेकिन आप की जरूरत नहीं है ^या के $बाद से sed की कोशिश करेंगे और सबसे लंबे मैच मिल जाएगा। इसके अलावा elit, आप डॉट को याद कर सकते हैं , \.यदि आवश्यक हो तो सम्मिलित कर सकते हैं ।
asoundmove

2
@asoundmove "एलिट" पर अनुगामी बिंदु पर अच्छी पकड़। - आपके पास काफी तेज आंख है !. मैंने पैटर्न में बची हुई डॉट को शामिल करने के लिए अपना उत्तर अपडेट कर दिया है। आपका यह भी सही है ^और $आवश्यक नहीं है - मैंने उन्हें वहाँ छोड़ दिया क्योंकि प्रश्नकर्ता ने उल्लेख किया (मूल रूप से) कि वह एक शुरुआत का एक सा था और यह अन्य संदर्भों में मददगार हो सकता है।
माइक एनवी

मैंने हमेशा सेड-पास्ट किए हुए सॉल्यूशन कॉपी किए हैं और उन्हें मेरी ज़रूरतों के हिसाब से फिट करने के लिए हैक किया है, लेकिन इस जवाब की बदौलत मुझे लगता है कि मैं वास्तव में अब इसे समझ गया हूं। शानदार उत्तर
टायलर

7

अगर हर लाइन में स्टार्ट और एंड पैटर्न दोनों हैं तो ऐसा करने का सबसे आसान तरीका है grep। प्रत्येक पंक्ति की शुरुआत और अंत को हटाने के बजाय आप दोनों पैटर्न के बीच की सामग्री का उत्पादन कर सकते हैं। -oजीएनयू में विकल्प grepकेवल मैचों आउटपुट:

grep -o 'consectetuer.*elit' file

नोट: जैसा कि उल्लेख किया गया है, यह केवल तभी काम करता है जब फ़ाइल की प्रत्येक पंक्ति को इस तरह पार्स किया जा सकता है। तो फिर, कि सभी विशिष्ट उपयोग के मामलों का 80% है।


1

AWK में दो छोरों के लिए:

$ awk '{for(i=1;i<=NF;i++) {if ($i == "consectetuer") beginning=i; if($i== "elit.") ending=i }; for (j=beginning;j<=ending;j++) printf $j" ";printf "\n"   }' file.txt 
consectetuer adipiscing elit.

AWK का gsub:

$ awk '{gsub(/^.*consectetuer/,"consectetuer"); gsub(/elit.*$/,"elit.");print}' file.txt
consectetuer adipiscing elit.

1

एक पर्ल तरीका है। यह अनिवार्य रूप से माइक केsed उत्तर के समान है :

perl -pe 's/.*(consectetuer.*elit).*./$1/' file

इसका -pअर्थ है "दी गई स्क्रिप्ट को लागू करने के बाद हर पंक्ति को प्रिंट करें -e"। s/foo/bar/प्रतिस्थापन ऑपरेटर है, इसके fooसाथ बदल जाएगा bar। कोष्ठक एक पैटर्न पर कब्जा करते हैं और हमें प्रतिस्थापन में इसका उपयोग करते हैं। पहला कैप्चर किया गया पैटर्न है $1, दूसरा $2और इसी तरह।

तो, कमांड सब कुछ consectetuer( .*consectetuer) तक, फिर सब कुछ elit( तब तक .*elit) और फिर लाइन के अंत तक सब कुछ ( ) से मेल खाएगा .*और कैप्चर किए गए पैटर्न के साथ प्रतिस्थापित करेगा।


1

मुझे यकीन नहीं है कि इस प्रश्न का शीर्षक " फ़ाइल से" एक लाइन से "" क्यों संपादित किया गया है, जबकि ओपी कई लाइनों में संभावना को बाहर नहीं करता है, भले ही उदाहरण केवल एक पंक्ति प्रतीत हो। जो भी हो, यह यहां कई लाइनों का समाधान प्रदान करने में मददगार हो सकता है।

यह क्रॉस-लाइन्स के लिए काम करता है:

from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"

उदाहरण:

[xiaobai@xiaobai tmp]$ cat file
1
abc consectetuer lsl

home

def elit dd
2 consectetuer ABC elit
[xiaobai@xiaobai tmp]$ from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"
consectetuer lsl

home

def elit
[xiaobai@xiaobai tmp]$ 

संदर्भ: शेल पैरामीटर विस्तार


1
यह बिल्कुल सही है!
क्लेमेंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.