2012-04-03 9 views
13

Ich habe eine Datei, die gelegentlich Split-Linien hat. Die Aufteilung wird durch die Tatsache signalisiert, dass die Zeile mit '+' beginnt (möglicherweise vor Leerzeichen).sed: Verbindungslinien abhängig von der zweiten

line 1 
line 2 
    + continue 2 
line 3 
... 

Ich möchte die Trennlinie kommen zurück:

line 1 
line 2 continue 2 
line 3 
... 

sed verwenden. Mir ist nicht klar, wie man eine Linie mit dem vor eins verbindet.

Irgendwelche Vorschläge?

Antwort

15

Dies könnte für Sie arbeiten:

sed '$!N;s/\n\s*+//;P;D' file 
+1

Schön, das funktioniert sogar in nicht-GNU sed, wenn Sie '\ s' durch ein Leerzeichen ersetzen! +1. – ghoti

+0

@ghoti Ich glaube, '[[:: blank:]] * * kann besser funktionieren? –

+1

@AquariusPower, ja, das passt Leerzeichen, aber es wird auch Tabs, die natürlich potongs Lösung von '\ s passt auch übereinstimmen. Das OP erklärte, dass eine Fortsetzung durch ein * '+' mögliches vorangestelltes Leerzeichen * gekennzeichnet wurde, aber er sagte nichts von Tabs. Wahrscheinlich ist es egal, aber man weiß es nie. – ghoti

2

Ich bin nicht zu sed teilweise so das war eine nette Herausforderung für mich.

sed -n '1{h;n};/^ *+ */{s// /;H;n};{x;s/\n//g;p};${x;p}' 

In awk ist dies etwa:

awk ' 
    NR == 1 {hold = $0; next} 
    /^ *\+/ {$1 = ""; hold=hold $0; next} 
    {print hold; hold = $0} 
    END {if (hold) print hold} 
' 

Wenn die letzte Zeile ist eine "+" -Linie, die sed-Version eine Hinterleerzeile gedruckt wird. Konnte nicht herausfinden, wie man es unterdrückt.

+0

Hinweis, dass diese GNU-sed-only. Die awk-Version ist natürlich viel besser lesbar, leidet aber auch darunter, dass Sie awk, wenn Sie $ 1 = ""; 'sagen, $ 0 mit dem Standard-OFS umschreiben. Das ist vielleicht nicht wichtig, aber es sollte in Erinnerung bleiben, falls jemand diese Lösung verwenden möchte. – ghoti

1

dies in sed zu tun, ist sicherlich eine gute Übung, aber es ist ziemlich trivial in Perl:

perl -0777 -pe 's/\n\s*\+//g' input 
2

Sie können Vim verwenden in Ex-Modus:

ex -sc g/+/-j -cx file 
  1. globaleSuche

  2. - vorherige Zeile wählen

  3. j mit Linie nächster kommen

  4. x speichern und schließen

Verwandte Themen