
¿Cómo puedo sed
eliminar 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} 1
aquíc
está la enésima línea después de la coincidencia que se debe ignorar1
para imprimir el registro de entradac && !--c{next}
el&&
operador de cortocircuito es, por lo que mientrasc
se evalúe como falso,c
no disminuirá. Después dec
establecer un valor, se reducirá siempre que no alcance0
Respuesta3
sed '/Enter your password.*/{N;p;N;d;}' file