lunes, 28 de marzo de 2011

Eliminar un bloque de línea con sed saltándose unas líneas desde la línea que hace match

Por ejemplo tengo un fichero con el siguiente formato:

ficheroEntrada.txt:

aaaaaaaaa
una línea
primera línea q quiero eliminar
segunda línea q quiero eliminar
tercera línea q quiero eliminar
otra línea
...
aaaaaaaaa
una línea
primera línea q quiero eliminar
segunda línea q quiero eliminar
tercera línea q quiero eliminar
otra línea
...


Quiero/puedo encontrar las líneas con el patrón "aaaaaaaaa", y a partir de cada una, quiero eliminar el bloque de 3 líneas que se encuentran saltando 1 línea desde la línea que encajó con el patrón de búsqueda.

Para ello puedo ejecutar el siguiente script:

cat ficheroEntrada.txt | sed -e '/aaaaaaaaa/ {n;n;N;N;d}' > ficheroSalida.txt


Para cada línea que contiene el patŕon "aaaaaaaaa":

  • Con el primer n salta a la siguiente línea tras la línea que hizo match.

  • Con el segundo n alcanza la primera línea que nos interesa, desechando la anterior.

  • Avanza dos líneas más, pero esta vez agregándolas al pattern space. Por cada línea que agrega, mete delante de la línea el carácter salto de línea.

  • Una vez que hemos acumulado las 3 líneas que queríamos borrar en el pattern space, las borramos con el comando "d". Y aquí termina el ciclo de operaciones que se hace por cada línea "aaaaaaaaa" encontrada.