Si alguna línea inmediatamente después de un partido se debe eliminar, entonces su sed
programa 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 sed
lee 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, sed
comprueba la línea anterior para una coincidencia y match
, si !
no se encuentra, se ejecutan las dos expresiones en la {
función }
. sed
voluntad g
y 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 match
se esta p
rinted
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
match
match
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