2012-04-03 18 views
13

Tengo un archivo que, de vez en cuando, tiene líneas divididas. La división se señala por el hecho de que la línea comienza con '+' (posiblemente precedido por espacios).sed: unir líneas dependiendo del segundo

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

me gustaría unirse a la línea de división de vuelta:

line 1 
line 2 continue 2 
line 3 
... 

usando sed. No tengo claro cómo unirme a una línea con anterior a.

¿Alguna sugerencia?

Respuesta

15

Esto podría funcionar para usted:

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

¡Agradable, esto incluso funciona en sedimentos no GNU si reemplazas '\ s' con un espacio! +1. – ghoti

+0

@ghoti Creo que '[[: blank:]] *' puede funcionar mejor? –

+1

@AquariusPower, sí, eso coincidirá con los espacios, pero también coincidirá con las pestañas, que por supuesto la solución de potong también coincide con 's '. El OP indicó que una continuación se denotaba con un * '+' posible precedido de espacios *, pero no decía nada de las pestañas. Probablemente no importe, pero nunca se sabe. – ghoti

2

No soy parco a sed, así que este fue un gran desafío para mí.

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

en AWK esto es aproximadamente:

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

Si la última línea es una línea de "+", la versión de sed, se imprimirá una línea en blanco al final. No pude encontrar la manera de suprimirlo.

+0

Tenga en cuenta que este es GNU-SED-solamente. La versión de awk es mucho más legible, por supuesto, pero también sufre porque cuando '$ 1 =" ";' le dices a awk que reescriba $ 0 con su OFS predeterminado. Eso puede no ser importante, pero debe recordarse en caso de que alguien quiera usar esta solución. – ghoti

1

Hacer esto en que sed es sin duda un buen ejercicio, pero es bastante trivial en Perl:

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

Puede usar Vim en modo Ex:

ex -sc g/+/-j -cx file 
  1. g búsqueda global

  2. - seleccione línea anterior

  3. j se unen con la siguiente línea

  4. x guardar y cerrar

Cuestiones relacionadas