Excluir linhas x após uma correspondência

Excluir linhas x após uma correspondência

Como posso sedexcluir as linhas dois (ou qualquer número) após uma correspondência, mas sem incluir a correspondência e as linhas intermediárias?

Por exemplo:

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

Quero excluir apenas a linha "> mysecretword" por ser duas linhas após a linha "Digite sua senha no prompt abaixo". Não posso usar posições absolutas de números de linha, porque a correspondência pode aparecer qualquer número de linhas após o início do arquivo.

Pesquisando on-line encontro muitas soluções como sed '/Enter your password.*/,+3d' filex, mas isso também removeria a linha "Digite sua senha..." e a linha seguinte, que não é o que eu quero. Quero remover apenas uma linha, que é um certo número de linhas após uma correspondência.

Como posso fazer isso com sed(ou mesmo com qualquer outra ferramenta comumente disponível)?

Responder1

Talvez

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

ou 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

Responder2

Para casos genéricos, veja esta excelente resposta de Ed Morton:Imprimindo com sed ou awk uma linha seguindo um padrão correspondente .

d) Imprima todos os registros, exceto o enésimo registro após alguma regexp:

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

Solicitando uma determinada entrada

$ 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} 1aqui cestá a enésima linha após a correspondência a ser ignorada, 1para imprimir o registro de entrada
  • c && !--c{next}o &&is operador de curto-circuito, portanto, desde que cseja avaliado como falso, cnão será decrementado. Depois de cdefinido com um valor, ele será decrementado até que não atinja0

Responder3

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

informação relacionada