GNU/Linux >> Tutoriales Linux >  >> Linux

¿Imprimir línea anterior después de una coincidencia de patrón usando Sed?

Quiero imprimir la línea anterior, cada vez que se encontró una coincidencia. Sé sobre grep -A y -B opciones Pero mi máquina Solaris 5.10 no admite esas opciones.

Quiero una solución usando solo sed .

Foo.txt :

Name is : sara
age is : 10
Name is : john
age is : 20
Name is : Ron
age is : 10
Name is : peggy
age is : 30

Out.txt :

Name is : sara
Name is : Ron

El patrón que intento hacer coincidir fue age is : 10 .

Mi entorno, Solaris 5.10.

Respuesta aceptada:

$ sed -n '/age is : 10/{x;p;d;}; x' Foo.txt 
Name is : sara
Name is : Ron

Lo anterior fue probado en GNU sed. Si el sed de Solaris no admite el encadenamiento de comandos con punto y coma, intente:

$ sed -n -e '/age is : 10/{x;p;d;}' -e x Foo.txt 
Name is : sara
Name is : Ron

Cómo funciona

sed tiene un espacio de espera y un espacio patrón. Las nuevas líneas se leen en el espacio del patrón. La idea de este script es que la línea anterior se guarde en el espacio de espera.

  • /age is : 10/{x;p;d;}

    Si la línea actual contiene age is : 10 , luego haz:

    x :cambia el patrón y mantén presionado el espacio para que la línea anterior esté en el espacio del patrón

    p :imprime la línea anterior

    d :elimine el espacio del patrón y comience a procesar la siguiente línea

  • x

    Esto se ejecuta solo en líneas que no contienen age is : 10 . En este caso, guarda la línea actual en el espacio de espera.

Hacer lo contrario

Supongamos que queremos imprimir los nombres de las personas cuya edad es no 10:

$ sed -n -e '/age is : 10/{x;d}' -e '/age is :/{x;p;d;}' -e x Foo.txt 
Name is : john
Name is : peggy

Lo anterior agrega un comando al principio, /age is : 10/{x;d} , para ignorar a cualquier persona de 10 años. El comando que sigue, /age is :/{x;p;d;} , ahora acepta todas las edades restantes.


Linux
  1. Uso de Sed para buscar y reemplazar una línea entre rangos de patrones

  2. ¿Coincidencia de patrones multilínea usando Sed, Awk o Grep?

  3. ¿Encuentra el número de línea que contiene el patrón usando el delimitador Regex personalizado?

  4. ¿Reemplazar el patrón después de encontrar la enésima coincidencia en cada línea?

  5. ¿Devolver solo la parte de una línea después de un patrón coincidente?

Cómo realizar una búsqueda de patrones en archivos usando Grep

Cómo quitar líneas de un archivo usando el comando Sed

Inserte varias líneas en un archivo después del patrón especificado usando el script de shell

Bash:cómo imprimir cadenas de varias líneas (con '\ n') usando printf

¿Cómo inserto texto en la primera línea de un archivo usando sed?

Usar sed para reemplazar entre un patrón específico