Si alguna línea inmediatamente después de un partido se debe eliminar, entonces su sedprograma tendrá que considerar partidos consecutivos. En otras palabras, si elimina una línea que sigue a una coincidencia que también coincide, entonces probablemente también debería eliminar la línea que sigue a esa coincidencia.
Se implementa simplemente, pero hay que mirar un poco hacia atrás.
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
Funciona intercambiando espacios de espera y patrón para cada línea leída, por lo que la última línea se puede comparar con la actual cada vez. Entonces, cuando sedlee una línea, intercambia el contenido de sus búferes, y la línea anterior es el contenido de su búfer de edición, mientras que la línea actual se coloca en el espacio de espera.
Por lo tanto, sedcomprueba la línea anterior para una coincidencia y match, si !no se encuentra, se ejecutan las dos expresiones en la {función }. sedvoluntad gy el espacio de la bodega al sobrescribir el espacio de patrones - lo que significa que la línea actual es entonces tanto en los espacios de bodega y el patrón - y entonces //comprobar que para un partido a su expresión regular más recientemente compilado - match- y si él no lo hace matchse esta printed
Esto significa que una línea solo se imprime si no lo hace y la línea inmediatamente anterior no . También renuncia a cualquier intercambio innecesario por secuencias de es.match matchmatch
Si desea una versión que pueda eliminar un número arbitrario de líneas después de una match, necesitaría un poco más de trabajo:
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... reemplace el 5 con el número de líneas (incluida la línea coincidente) que desea eliminar ...
1
2
3
4
12
13
14
21