2012-04-03 11 views
13

Ho un file che, occasionalmente, ha linee divise. La divisione è segnalata dal fatto che la linea inizia con '+' (eventualmente preceduto da spazi).sed: linee di giunzione a seconda del secondo

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

Mi piacerebbe unire la linea di divisione posteriore:

line 1 
line 2 continue 2 
line 3 
... 

utilizzando sed. Non sono chiaro come unire una linea con lo precedente allo.

Qualche suggerimento?

risposta

15

Questo potrebbe funzionare per voi:

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

Bello, questo funziona anche in non GNU se si sostituisce '\ s' con uno spazio! +1. – ghoti

+0

@ghoti Credo che [[: blank:]] * 'potrebbe funzionare meglio? –

+1

@AquariusPower, sì, che corrisponderà agli spazi, ma corrisponderà anche alle schede, che naturalmente corrisponde anche alla soluzione di 's s di potong. L'OP affermava che una continuazione era denotata da un * '+' possibile preceduto da spazi *, ma non diceva nulla di tab. Probabilmente non importa, ma non si sa mai. – ghoti

2

Non sono parziale a sed, quindi questa è stata una bella sfida per me.

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

In awk questo è di circa:

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

Se l'ultima riga è un "+" linea, la versione sed stamperà una riga vuota finale. Non riuscivo a capire come sopprimerlo.

+0

Si noti che questo è GNU-sed-only. La versione di awk è ovviamente più leggibile, ma soffre anche perché quando si '$ 1 =" ";', si dice a awk di riscrivere $ 0 con il suo OFS predefinito. Questo potrebbe non essere importante, ma dovrebbe essere ricordato nel caso qualcuno volesse usare questa soluzione. – ghoti

1

Fare questo in sed è certamente un buon esercizio, ma è piuttosto banale in Perl:

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

È possibile utilizzare Vim in modalità Ex:

ex -sc g/+/-j -cx file 
  1. g ricerca globale

  2. - selezionare riga precedente

  3. j unirsi con riga successiva

  4. x Salva e chiudi

Problemi correlati