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ónp
:imprime la línea anteriord
: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.