Esto podría funcionar para usted (GNU SED):
echo -e "a\nyyyy\nxxxx\nzzzz\nb" | sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D'
a
b
Esto mantiene una ventana de dos líneas en el espacio de patrones y si la expresión regular requerida se encuentra en la primera o segunda línea, lee la siguiente línea y luego elimina las tres líneas. Los casos extremos son si la expresión regular se encuentra en la primera o la última línea cuando no hay línea antes/después. En estos casos, solo se pueden eliminar dos líneas.
Por cierto, esta solución puede haber desenterrado un posible error en GNU sed. El indicador M
de una dirección permite utilizar los metacaracteres ^
y $
como marcadores de longitud cero en una expresión regular para el inicio y el final de línea en cadenas de líneas múltiples. La dirección vacía //
reutiliza una dirección previamente establecida. ¿Debería esa dirección incluir una bandera multilínea? Actualmente parece incluir la bandera incluso si no se indica es decir
sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D' file
produce una diferente (correcto) dar lugar a:
sed 'N;/^xxxx/M{//d;$!N;d};P;D' file
si xxxx
aparece en la segunda línea de un archivo.
Una explicación adicional de la 'x' comando que "eXchanges" el espacio del patrón con el búfer de retención: http://www.grymoire.com/Unix/Sed.html#uh-53 –
no puedo ejecutar el script anterior. dice sed: FUNCTION/^ pattern/{n n x d} x 1d p $ {x p} no se puede analizar ¿no está seguro de por qué? –