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หรือมีเครื่องมือที่ดีกว่านี้หรือไม่


ดูเหมือนน้อยกว่าที่คุณต้องการจับคู่สองบรรทัดและอื่น ๆ ที่คุณต้องการเข้าร่วมบรรทัดหลังจากที่คุณพบการแข่งขัน ใช่?
kurtm

คำตอบ:


13
sed 'N;s/\n/ /'
  • N รวมบรรทัดอินพุตถัดไปเข้ากับพื้นที่รูปแบบ
  • s/\n/ / แทนที่บรรทัดใหม่ที่แยกบรรทัดด้วยช่องว่าง

หรือ:

sed -n 'N;s/\n/ /;/regex/p'
  • -n ปิดใช้งานการพิมพ์พื้นที่ลวดลายโดยอัตโนมัติเป็นคำสั่งสุดท้าย
  • /regex/p พิมพ์บรรทัดที่ตรงกับ regex

ใช้ปรับแต่งสำหรับการแทนในกรณีที่คุณจะเข้าร่วมมากขึ้นกว่าสองสายเช่นgN;N;N;s/\n/ /g


ชี้ไปที่ต้องจำไว้: sed ทำงานบนเส้น! ฉันใช้เวลานานหลายปีในการพยายามsed 's/>\n</>,</'ทำงานจนกว่าฉันจะรู้ตัวว่าทำงานบนเส้นได้ตลอดเวลา ค้นหา Duckduckgo อย่างรวดเร็วหนึ่งตัวและ @ peterph อนุญาตให้ฉันเก็บผมที่เหลือไว้
Northern-bradley

6

ดูเหมือนว่าapt-getบรรทัดนั้นมีช่องว่างก่อนหน้า พูดว่า:

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

ควรสร้างผลลัพธ์ที่ต้องการ

หรือคุณสามารถใช้paste:

paste -d' ' - - < inputfile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.