Saltar al contenido

Cómo seleccionar líneas entre dos patrones de marcadores que pueden ocurrir varias veces con awk / sed

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 el flag cuando el texto abc es encontrado. Luego, se salta la línea.
  • /mno/{flag=0} desarma el flag cuando el texto mno es encontrado.
  • El final flag es un patrón con la acción predeterminada, que es print $0: si flag 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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *