Como remover várias linhas por ocorrência em um arquivo?

10

Digamos que eu tenha esse arquivo de linha 857835, contendo coisas como esta:

a1
rubbish1
rubbish2
rubbish3
rubbish4
a1
rubbish5
rubbish6
rubbish7
rubbish8

E eu desejo remover todas as ocorrências a1e a próxima linha ( rubbish1e rubbish5neste exemplo). Como eu faço isso?

Eu tentei grep 'a1' -v -A1sem sucesso e meu sed skillz não é realmente ótimo:}

Meu Google-fu não conseguiu me ajudar dessa vez, alguém por favor ajude!

rayfoo
fonte

Respostas:

15

Experimentar:

sed -e '/^a1$/,+1d' "filename"

Isso significa de / ^ a1 $ / para a próxima linha, exclua

Os ^ e $ garantem que você corresponda à linha inteira, para que um a1 oculto não seja correspondido.

asoundmove
fonte
6
Você pode querer ^e $nessa partida, para forçar correspondentes linhas inteiras.
Jander
@Jander: Claro, corrigido
asoundmove
12

O seguinte funcionará em não-GNU sed(a ,+1sintaxe do endereço é uma extensão GNU):

sed -e '/^a1$/,/^/d' my_file >my_filtered_file

"Começando em uma linha que lê exatamente 'a1' e terminando na próxima linha para a qual existe o início da linha (ou seja, a próxima linha), exclua".

É muito menos extensível do que a resposta de @ asoundmove, pois a exclusão de um número diferente de linhas exigiria um script totalmente diferente.

Jander
fonte