sed: मैच दो लाइनों


11

मेरे पास एक पाठ फ़ाइल है, जहां रिकॉर्ड दो लाइनों पर विभाजित हैं। मैं उन्हें एक लाइन पर रखना चाहूंगा। रिकॉर्ड कुछ इस तरह दिखते हैं:

2013-07-29
 apt-get install git
2013-07-29
 apt-get install rsync
2013-07-31
 apt-get install nmap
2013-08-02
 apt-get install cifs-utils
2013-08-05
 apt-get install telnet

मैं निम्नलिखित प्राप्त करना चाहूंगा:

2013-07-29 apt-get install git
2013-07-29 apt-get install rsync
2013-07-31 apt-get install nmap
2013-08-02 apt-get install cifs-utils
2013-08-05 apt-get install telnet

मैंने कोशिश की sed, लेकिन मैं दो लाइनों का मिलान करने में असमर्थ हूं। वहाँ कुछ चाल है sed, या वहाँ कुछ बेहतर उपकरण है?


ऐसा लगता है जैसे आप दो लाइनों से मेल खाना चाहते हैं, और अधिक आप एक मैच खोजने के बाद लाइन में शामिल होना चाहते हैं। हाँ?
कुर्टम

जवाबों:


13
sed 'N;s/\n/ /'
  • N पैटर्न अंतरिक्ष के लिए अगली इनपुट लाइन में मिलती है
  • s/\n/ / नई-पंक्ति को प्रतिस्थापित करता है जो एक स्थान के साथ लाइनों को अलग करती है।

या:

sed -n 'N;s/\n/ /;/regex/p'
  • -n अंतिम आदेश के रूप में पैटर्न स्पेस की स्वचालित प्रिंटिंग अक्षम करता है
  • /regex/p प्रिंट्स रेगेक्स से मेल खाता है

gयदि आप दो से अधिक लाइनों में शामिल हो रहे हैं, तो प्रतिस्थापन के लिए संशोधक का उपयोग करें N;N;N;s/\n/ /g


याद करने की बात: तर्ज पर सेड काम करता है! मैंने उम्र बिताने के sed 's/>\n</>,</'लिए काम करने की कोशिश की जब तक मुझे एहसास नहीं हुआ कि sed एक समय में लाइनों पर काम करता है। एक त्वरित duckduckgo खोज और @peterph ने मुझे अपने बालों के बाकी हिस्सों को रखने की अनुमति दी
उत्तरी-

6

ऐसा लगता है कि apt-getलाइनों में एक पूर्ववर्ती व्हाट्सएप है। कह रही है:

sed -e :a -e '$!N;s/\n / /;ta' -e 'P;D' inputfile

वांछित परिणाम का उत्पादन करना चाहिए।

वैकल्पिक रूप से, आप भी उपयोग कर सकते हैं paste:

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