2012-04-03 20 views
13

Mam plik, który czasami ma podzielone linie. Podział jest sygnalizowany faktem, że linia zaczyna się od "+" (prawdopodobnie poprzedzona spacjami).sed: łączenie linii w zależności od drugiego

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

Chciałbym dołączyć linię podziału powrotem:

line 1 
line 2 continue 2 
line 3 
... 

użyciu sed. Nie wiem, jak dołączyć do linii o numerze poprzedzającym.

Jakieś sugestie?

Odpowiedz

15

ten może pracować dla Ciebie:

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

Miło, to działa nawet w non-GNU sed, jeśli zastąpisz '\ s' spacją! +1. – ghoti

+0

@ghoti Wierzę, że [[: blank:]] * 'może działać lepiej? –

+1

@AquariusPower, tak, to będzie pasować do spacji, ale będzie też pasować do kart, które oczywiście pasongowe rozwiązanie '\ s' pasuje również. OP oświadczył, że kontynuacja została oznaczona przez * * + możliwe poprzedzone spacjami *, ale nie powiedział nic o zakładkach. Prawdopodobnie nie ma znaczenia, ale nigdy nie wiadomo. – ghoti

2

nie jestem częściowe do sed więc to był miły dla mnie wyzwaniem.

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

W awk jest to w przybliżeniu:

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

Jeśli ostatnia linia to linia "+", wersja sed wypisze tyłu pusty wiersz. Nie mogłem wymyślić, jak to powstrzymać.

+0

Należy pamiętać, że jest to GNU sed-only. Wersja awk jest oczywiście bardziej czytelna, ale też cierpi, ponieważ kiedy '$ 1 =" ";', mów awk, aby przepisał $ 0 z domyślnym OFS. To może nie być ważne, ale powinno być zapamiętane na wypadek, gdyby ktoś chciał skorzystać z tego rozwiązania. – ghoti

1

Robi to w sed pewnością jest to dobre ćwiczenie, ale to dość trywialne w Perlu:

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

Można użyć Vima w trybie Ex:

ex -sc g/+/-j -cx file 
  1. g globalna wyszukiwarka

  2. - wybrać poprzednią linię

  3. j przyłączyć się do następnej linii

  4. x Zapisz i zamknij

Powiązane problemy