Apagar linhas x depois de uma partida [duplicada]

3

Como posso usar sed para deletar linhas duas (ou qualquer número) depois de uma partida, mas sem incluir a partida e as linhas entre elas?

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", pois são duas linhas após a linha "Digite sua senha no prompt abaixo". Eu não posso usar posições de número de linha absolutas, porque a partida poderia aparecer qualquer número de linhas depois do começo do arquivo.

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

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

    
por Kidburla 30.11.2017 / 03:02

3 respostas

6

Talvez

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

ou equivalentemente:

$ 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
    
por 30.11.2017 / 03:13
2

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

d) Print every record except the Nth record after some regexp:

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

Candidatar-se a 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 here c é a nona linha após a correspondência ser ignorada, 1 para imprimir o registro de entrada
  • c && !--c{next} o && é o operador de curto-circuito, portanto, contanto que c seja falso, c não será decrementado. Depois que c for definido para um valor, ele será diminuído desde que não atinja 0
por 30.11.2017 / 05:24
0
sed '/Enter your password.*/{N;p;N;d;}' file
    
por 30.11.2017 / 03:31

Tags