Eliminar líneas x después de una coincidencia

Eliminar líneas x después de una coincidencia

¿Cómo puedo sedeliminar las líneas dos (o cualquier número) después de una coincidencia pero sin incluir la coincidencia y las líneas intermedias?

Por ejemplo:

Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
> mysecretword
Password accepted

Solo quiero eliminar la línea "> mysecretword" porque está dos líneas después de la línea "Ingrese su contraseña en el siguiente mensaje". No puedo usar posiciones absolutas de números de línea, porque la coincidencia podría aparecer cualquier número de líneas después del inicio del archivo.

Buscando en línea encuentro muchas soluciones como sed '/Enter your password.*/,+3d' filex, pero esto también eliminaría la línea "Ingrese su contraseña..." y la siguiente línea, que no es lo que quiero. Solo quiero eliminar una línea, que es una cierta cantidad de líneas después de una coincidencia.

¿Cómo puedo hacer esto con sed(o incluso con cualquier otra herramienta comúnmente disponible)?

Respuesta1

Tal vez

sed '/^Enter your password/ {
n
n
d
}' file

o equivalente:

$ sed '/^Enter your password/ {n;n;d;}' file
Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
Password accepted

Respuesta2

Para casos genéricos, consulte esta excelente respuesta de Ed Morton:Imprimir con sed o awk una línea siguiendo un patrón coincidente .

d) Imprima todos los registros excepto el enésimo registro después de alguna expresión regular:

awk 'c&&!--c{next}/regexp/{c=N}1' file

Solicitar una entrada dada

$ awk 'c && !--c{next} /^Enter your password/{c=2} 1' ip.txt 
Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
Password accepted
  • /^Enter your password/{c=2} 1aquí cestá la enésima línea después de la coincidencia que se debe ignorar 1para imprimir el registro de entrada
  • c && !--c{next}el &&operador de cortocircuito es, por lo que mientras cse evalúe como falso, cno disminuirá. Después de cestablecer un valor, se reducirá siempre que no alcance0

Respuesta3

sed '/Enter your password.*/{N;p;N;d;}' file

información relacionada