2012-03-16 8 views
11

मैंने अपनी समस्या को हल करने के संकेतों के लिए मंच के माध्यम से पढ़ा है, लेकिन संबंधित धागे में से कोई भी मेरे लिए उपयोग योग्य नहीं है, सीमित प्रोग्रामिंग ज्ञान के साथ, मेरी विशिष्ट समस्या पर लागू करने के लिए।किसी विशिष्ट मिलान लाइन से लाइनों की एक श्रृंखला को हटाने के लिए Sed एक विशिष्ट मिलान लाइन (अंतिम पंक्ति सहित नहीं) तक

मेरी समस्या यह है: मुझे अपनी फ़ाइल में क्लस्टर किए गए कचरे की लाइनों से छुटकारा पाने की ज़रूरत है, लेकिन उपयोग योग्य लाइनों के क्लस्टर के बीच में हैं। मैंने पैटर्न मैनुअल और रेंजों को हटाने के बारे में अन्य सूचनात्मक स्रोतों की खोज की जो पैटर्न से मेल खाते हैं, लेकिन वे केवल यूएनटीआईएल मैच पैटर्न को हटाने के लिए उल्लेख करते हैं, टिल नहीं।

अब मैं एक ऐसी श्रेणी निर्दिष्ट करना चाहूंगा जिसके लिए लाल रेखा पहली पंक्ति से शुरू हो रही है जो पैटर्न पैटर्न से मेल खाती है जो कि अन्य पैटर्न से मेल खाती है। इसके अलावा, sed को लाइनों के अंत में मौजूद पैटर्न को पहचानने की आवश्यकता है।

उदाहरण के लिए:

line 1 
blah blah 1 
blah blah 2 
blah blah 3 
blah blah 4 
line 2 
line 3 

परिणाम होने की जरूरत है:

line 1 
blah blah 1 
line 2 
line 3 

कृपया ध्यान दें लाइन और और लाइन 2. के बीच कई पंक्तियों, ऐसा 1 जरूरतों रहने के लिए करते हैं, अन्य 3 की जरूरत हटाए जाने के लिए।

धन्यवाद!

+1

+1 अच्छी तरह से स्वरूपित सवाल है, नमूना इनपुट के साथ, और आवश्यक उत्पादन के लिए। सौभाग्य। – shellter

उत्तर

13

इस

sed -n '/line 1/{;p;n;p;};/line 2/,$p' sedTest1.txt 

#output 
line 1 
blah blah 1 
line 2 
line 3 

deconstructed एसईडी का प्रयास करें:

sed -n '/line 1/{;p;n;p;};/line 2/,$p' sedTest1.txt 
    | |  |  |  |||-> print the range 
    | |  |  |  ||-> til end of file (the '$' char) 
    | |  |  |  |-> range operator (i.e. start,end) 
    | |  |  |-> beginning of range to watch for and print 
    | |  |-> now print line, get 'n'ext, print that line 
    | |-> match the line with text 'line 1' 
    |-> don't print every line, only ones flagged with 'p' 

नीचे से ऊपर इस पढ़ें।

इसके अलावा, चूंकि आपका डेटा नमूना है, और आप इसे कचरा लाइन के रूप में देखते हैं, यह आसान नहीं हो सकता है। आपको गति तक पहुंचने के लिए सैड ट्यूटोरियल देखना होगा।

मुझे आशा है कि इस मदद करता है।

+0

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

+0

धन्यवाद, पूरी तरह से काम करता है, बहुत सराहना की! – FlyingDutch

+0

खुशी है कि मदद की। क्या आप इसे स्वीकार के रूप में चिह्नित करेंगे? (Http://i.imgur.com/uqJeW.png देखें)। इसके अलावा यदि आप sed के साथ काम करना जारी रखते हैं, तो http://www.grymoire.com/Unix/Sed.html को पढ़ना सुनिश्चित करें और अपने टेक्स्ट प्रोसेसिंग कौशल को बढ़ाने के लिए, awk, http: //www.grymoire का उपयोग करें। कॉम/यूनिक्स/Awk.html। सौभाग्य! – shellter

0
$ sed -n '/line 1/{p;n;p;:a;n;/line 2/{:c;p;n;bc};ba};p' input.txt 
line 1 
blah blah 1 
line 2 
line 3 
+0

मेरे विचार को मेरे साथ साझा करने के लिए धन्यवाद। मैं वर्तमान में यह जांचने के लिए अपने सर्वर तक नहीं पहुंच सकता कि यह काम करता है, लेकिन मैं आपके पास वापस आऊंगा। चीयर्स – FlyingDutch

1

यह आप के लिए काम कर सकते हैं:

sed '/line 1/,/line 2/{//!d;/line 1/N}' file 
line 1 
blah blah 1 
line 2 
line 3 

या इस (यदि पर्वतमाला लगातार नहीं हैं):

sed '/line 1/,/line 2/{//!d;$!N}' file 
line 1 
blah blah 1 
line 2 
line 3 
+0

हाँ एक आकर्षण की तरह काम करता है। धन्यवाद – FlyingDutch

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