Solución:
Usar awk
con una bandera para activar la impresión cuando sea necesario:
$ awk '/abc/{flag=1;next}/mno/{flag=0}flag' file
def1
ghi1
jkl1
def2
ghi2
jkl2
¿Como funciona esto?
-
/abc/
coincide con las líneas que tienen este texto, así como/mno/
lo hace. -
/abc/{flag=1;next}
establece elflag
cuando el textoabc
es encontrado. Luego, se salta la línea. -
/mno/{flag=0}
desarma elflag
cuando el textomno
es encontrado. - El final
flag
es un patrón con la acción predeterminada, que esprint $0
: siflag
es igual a 1 se imprime la línea.
Para obtener una descripción más detallada y ejemplos, junto con los casos en los que los patrones se muestran o no, consulte ¿Cómo seleccionar líneas entre dos patrones?
Utilizando sed
:
sed -n -e '/^abc$/,/^mno$/{ /^abc$/d; /^mno$/d; p; }'
los -n
opción significa que no se imprime de forma predeterminada.
El patrón busca líneas que contengan solo abc
para sólo mno
, y luego ejecuta las acciones en el { ... }
. La primera acción elimina el abc
línea; el segundo el mno
línea; y el p
imprime las líneas restantes. Puede relajar las expresiones regulares según sea necesario. Cualquier línea fuera del rango de abc
..mno
simplemente no se imprimen.
Esto podría funcionar para usted (GNU sed):
sed '/^abc$/,/^mno$/{//!b};d' file
Eliminar todas las líneas excepto las que se encuentran entre las líneas que comienzan abc
y mno