2012-03-16 16 views
11

Leí en el foro las pistas de cómo resolver mi problema, pero ninguno de los hilos relacionados es utilizable para mí, con conocimientos limitados de programación, para aplicar a mi problema específico.Sed para eliminar un rango de líneas de una línea de coincidencia específica HASTA una línea de coincidencia específica (sin incluir la última línea)

Mi problema es este: Tengo que deshacerme de las líneas de basura que están agrupadas en todo mi archivo, pero están entre los grupos de líneas utilizables. Busqué en el manual de sed y en otras fuentes informativas sobre la eliminación de rangos que coinciden con los patrones, pero solo mencionan eliminar el patrón de coincidencia UNTIL, no TILL.

Ahora me gustaría especificar un rango para el cual sed elimina las líneas comenzando desde la primera línea que coincide con la línea del patrón hasta la línea que coincide con el otro patrón. Además, sed necesita reconocer los patrones que existen al final de las líneas.

Por ejemplo:

line 1 
blah blah 1 
blah blah 2 
blah blah 3 
blah blah 4 
line 2 
line 3 

resultado debe ser:

line 1 
blah blah 1 
line 2 
line 3 

Tenga en cuenta las múltiples líneas entre la línea y la línea 2. Mientras bla bla 1 necesita para mantenerse, los otros 3 necesidad para ser eliminado

Gracias!

+1

+1 para la pregunta bien formateado, la entrada de la muestra, y la salida requerida. Buena suerte. – shellter

Respuesta

13

probar este

sed -n '/line 1/{;p;n;p;};/line 2/,$p' sedTest1.txt 

#output 
line 1 
blah blah 1 
line 2 
line 3 

SED deconstruido:

sed -n '/line 1/{;p;n;p;};/line 2/,$p' sedTest1.txt 
    | |  |  |  |||-> print the range 
    | |  |  |  ||-> til end of file (the '$' char) 
    | |  |  |  |-> range operator (i.e. start,end) 
    | |  |  |-> beginning of range to watch for and print 
    | |  |-> now print line, get 'n'ext, print that line 
    | |-> match the line with text 'line 1' 
    |-> don't print every line, only ones flagged with 'p' 

Leer esto desde abajo hacia arriba.

Además, como sus datos son una muestra, Y usted se refiere a ellos como líneas de basura, puede que no sea así de simple. Tendrás que consultar los tutoriales de sed para ponerte al día.

Espero que esto ayude.

+0

Gracias por compartir tu idea conmigo cómo resolver mi problema. Actualmente no tengo acceso al servidor en el que necesito probar esto, pero te avisaré una vez que lo haya intentado. Cheers, – FlyingDutch

+0

Gracias, funciona a la perfección, muy apreciado! – FlyingDutch

+0

Me alegro de que haya ayudado. ¿Podrías marcar esto como aceptado? (Ver http://i.imgur.com/uqJeW.png). Además, si vas a seguir trabajando con sed, asegúrate de leer http://www.grymoire.com/Unix/Sed.html Y para mejorar tus habilidades de procesamiento de texto, usa awk, http: //www.grymoire. com/Unix/Awk.html. ¡Buena suerte! – shellter

0
$ sed -n '/line 1/{p;n;p;:a;n;/line 2/{:c;p;n;bc};ba};p' input.txt 
line 1 
blah blah 1 
line 2 
line 3 
+0

Gracias por compartir tu idea conmigo. Actualmente no puedo acceder a mi servidor para verificar si esto funciona, pero me pondré en contacto contigo. Cheers – FlyingDutch

1

Esto podría funcionar para usted:

sed '/line 1/,/line 2/{//!d;/line 1/N}' file 
line 1 
blah blah 1 
line 2 
line 3 

o esto (si los intervalos no son consecutivas):

sed '/line 1/,/line 2/{//!d;$!N}' file 
line 1 
blah blah 1 
line 2 
line 3 
+0

Yep funciona como un encanto también. Gracias – FlyingDutch

Cuestiones relacionadas