Excluindo um intervalo de n linhas antes e depois de uma linha correspondente?

12

Eu tenho um arquivo de configuração repetitivo e gostaria de corresponder a uma regex e excluir um intervalo de linhas antes e depois de uma correspondência. Eu também gostaria de excluir a correspondência em um comando.

Eu posso usar...

:g/match/-1d

... várias vezes para excluir mais de uma linha de antes de uma partida ...

... e combiná-lo com algumas chamadas para ...

:g/match/+1d

... para excluir mais de uma linha após a partida ...

Mas existe alguma maneira de excluir um intervalo de linhas, antes, depois e incluindo a correspondência com um comando?

leeand00
fonte

Respostas:

21

Você está quase lá; você também pode especificar um intervalo de linhas, na forma de [line1],[line2][command], em vez de apenas [line][command](como você está usando agora).

Você pode usar .para se referir à linha atual.

  • Para a linha atual e a próxima: :g/match/.,+1d
  • Para a linha atual e a anterior: :g/match/-1,.d
  • Para a linha anterior, atual e seguinte: :g/match/-1,+1d

Veja :help [range]para obter mais informações e nesta resposta há mais alguns exemplos .

Martin Tournoij
fonte
A sintaxe é a mesma no sed?
Leeand00 27/05
3
@ leeand00 Não. Tudo o que :gfaz é executar um comando ex nas linhas que correspondem a um padrão. Então digitação :g/match/.,+1dseria exatamente o mesmo que ir a todas as linhas com match, e digitando:.,+1d
Martin Tournoij
Essa é a coisa mais legal que aprendi no vim há algum tempo. Obrigado por compartilhar!
Lps