sed: dopasuj dwie linie

11

Mam plik tekstowy, w którym rekordy są podzielone na dwie linie. Chciałbym umieścić je w jednym wierszu. Dane wyglądają mniej więcej tak:

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

Chciałbym uzyskać następujące informacje:

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

Próbowałem z sed, ale nie jestem w stanie dopasować dwóch linii. Czy jest jakaś sztuczka sed, czy jest jakieś lepsze narzędzie?

Martin Vegter
źródło
Wydaje się, że mniej chcesz dopasować dwie linie, a bardziej chcesz dołączyć do linii po znalezieniu dopasowania. Tak?
kurtm

Odpowiedzi:

13
sed 'N;s/\n/ /'
  • N łączy następny wiersz wejściowy z przestrzenią wzorów
  • s/\n/ / zastępuje nową linię oddzielającą linie spacją.

lub:

sed -n 'N;s/\n/ /;/regex/p'
  • -n wyłącza automatyczne drukowanie przestrzeni wzorów jako ostatnie polecenie
  • /regex/p wypisuje linie pasujące do wyrażenia regularnego

Użyj gmodyfikatora do podstawień, jeśli dołączasz do więcej niż dwóch linii, np N;N;N;s/\n/ /g.

Peter
źródło
pamiętaj: sed działa na liniach! spędziłem wieki próbując dostać się sed 's/>\n</>,</'do pracy, dopóki nie zdałem sobie sprawy, że sed działa na liniach naraz. jedno szybkie wyszukiwanie duckduckgo i @peterph pozwoliło mi zachować resztę włosów
północno-Bradley
6

Wygląda na to, że apt-getlinie mają poprzedzające białe znaki. Powiedzenie:

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

powinien dać pożądany rezultat.

Możesz także użyć paste:

paste -d' ' - - < inputfile
diabelnie
źródło