Exclua 'N' nenhuma linha apenas na enésima ocorrência de um padrão em um arquivo usando o comando sed / awk

2

Eu uso o comando abaixo 'sed' para excluir 'N' no de linhas após cada correspondência de um padrão em um arquivo.

sed -i '/test/,+1d' file.txt

Suponha que eu tenha um padrão 'test' em um arquivo chamado file.txt. E eu quero excluir duas linhas somente após a segunda ocorrência de uma palavra 'teste'. Existe algum sed / awk um forro para isso?

Exemplo: arquivo.txt

test
apple
mango
test
brinjal
carrot
test
banana
gauva
    
por Rajesh Keladimath 06.01.2018 / 07:00

1 resposta

3

Para excluir o segundo test e a linha seguinte:

$ awk '/test/ && ++f == 2 {getline;next} 1' file.txt
test
apple
mango
carrot
test
banana
gauva

Como funciona:

  1. /test/ && ++f == 2 {getline;next}

    Sempre que encontramos a linha correspondente à regex test , incrementamos a variável f e, se f==2 , lemos em outra linha com getline e, em seguida, pula para recomeçar na linha next . Isso tem o efeito de descartar a linha test e a linha a seguir.

  2. 1

    Para todas as outras linhas, imprimimos a linha. ( 1 é awk taquigrafia para imprimir a linha.)

Alternar

Nesta abordagem, capturamos o número da linha da segunda ocorrência da linha correspondente test na variável N .

Imprimimos uma linha apenas se N ainda não estiver atribuído ou se a linha atual tiver pelo menos duas linhas após o número da linha N .

$ awk '/test/ && ++f == 2 {N=NR} (!N) || NR>=N+2' file.txt
test
apple
mango
carrot
test
banana
gauva
    
por John1024 06.01.2018 / 07:08