sed: Entspricht zwei Zeilen

11

Ich habe eine Textdatei, in der Datensätze in zwei Zeilen aufgeteilt sind. Ich möchte sie in eine Zeile setzen. Die Aufzeichnungen sehen ungefähr so ​​aus:

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

Ich möchte folgendes bekommen:

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

Ich habe es mit versucht sed, aber ich kann nicht zwei Zeilen abgleichen. Gibt es einen Trick sedoder ein besseres Werkzeug?

Martin Vegter
quelle
Es scheint weniger so, als ob Sie zwei Zeilen abgleichen möchten, als vielmehr, wenn Sie der Zeile beitreten möchten, nachdem Sie eine Übereinstimmung gefunden haben. Ja?
Kurtm

Antworten:

13
sed 'N;s/\n/ /'
  • N Verbindet die nächste Eingabezeile mit dem Musterbereich
  • s/\n/ / Ersetzt die neue Zeile, die die Zeilen trennt, durch ein Leerzeichen.

oder:

sed -n 'N;s/\n/ /;/regex/p'
  • -n Deaktiviert das automatische Drucken des Musterbereichs als letzten Befehl
  • /regex/p druckt Linien, die mit Regex übereinstimmen

Verwenden Sie den gModifikator für die Ersetzungen, wenn Sie mehr als zwei Zeilen verbinden, z N;N;N;s/\n/ /g.

Peterph
quelle
Punkt zu beachten: sed arbeitet auf Linien! Ich habe ewig versucht, sed 's/>\n</>,</'zur Arbeit zu kommen , bis mir klar wurde, dass sed gleichzeitig auf Linien arbeitet. Eine schnelle Duckduckgo-Suche und @peterph erlaubten mir, den Rest meiner Haare zu behalten
Northern Bradley
6

Es scheint, dass die apt-getZeilen ein vorangestelltes Leerzeichen haben. Sprichwort:

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

sollte das gewünschte Ergebnis liefern.

Alternativ können Sie auch Folgendes verwenden paste:

paste -d' ' - - < inputfile
devnull
quelle