
Como posso sed
excluir 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} 1
aquic
está a enésima linha após a correspondência a ser ignorada,1
para imprimir o registro de entradac && !--c{next}
o&&
is operador de curto-circuito, portanto, desde quec
seja avaliado como falso,c
não será decrementado. Depois dec
definido com um valor, ele será decrementado até que não atinja0
Responder3
sed '/Enter your password.*/{N;p;N;d;}' file