sed: cocokkan dua baris

11

Saya memiliki file teks, di mana catatan dibagi menjadi dua baris. Saya ingin menempatkan mereka pada satu baris. Catatan terlihat seperti ini:

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

Saya ingin mendapatkan yang berikut ini:

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

Saya sudah mencoba sed, tetapi saya tidak dapat mencocokkan dua baris. Apakah ada trik sed, atau ada alat yang lebih baik?

Martin Vegter
sumber
Sepertinya Anda tidak ingin mencocokkan dua baris, dan semakin banyak yang ingin bergabung setelah Anda menemukan kecocokan. Iya?
kurtm

Jawaban:

13
sed 'N;s/\n/ /'
  • N bergabung dengan jalur input berikutnya ke ruang pola
  • s/\n/ / mengganti baris baru yang memisahkan garis dengan spasi.

atau:

sed -n 'N;s/\n/ /;/regex/p'
  • -n menonaktifkan pencetakan ruang pola secara otomatis sebagai perintah terakhir
  • /regex/p mencetak garis yang cocok dengan regex

Gunakan gpengubah untuk penggantian jika Anda bergabung lebih dari dua baris, misalnya N;N;N;s/\n/ /g.

peterph
sumber
Poin yang perlu diingat: sed bekerja pada garis! Saya menghabiskan waktu lama untuk mulai sed 's/>\n</>,</'bekerja sampai saya menyadari bahwa sed bekerja pada garis pada satu waktu. satu pencarian duckduckgo cepat dan @peterph memungkinkan saya untuk menjaga sisa rambut saya
north-bradley
6

Tampaknya apt-getgaris - garis tersebut memiliki spasi putih sebelumnya. Pepatah:

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

harus menghasilkan hasil yang diinginkan.

Atau, Anda juga dapat menggunakan paste:

paste -d' ' - - < inputfile
devnull
sumber