Supprimer une plage de n lignes avant et après une ligne correspondante?

12

J'ai un fichier de configuration répétitif et je voudrais faire correspondre une expression régulière et supprimer une plage de lignes avant et après une correspondance. Je voudrais également supprimer la correspondance dans une seule commande.

Je peux utiliser...

:g/match/-1d

... plusieurs fois pour supprimer plusieurs lignes avant un match ...

... et combinez-le avec quelques appels à ...

:g/match/+1d

... pour supprimer plusieurs lignes après le match ...

Mais existe-t-il un moyen de supprimer une plage de lignes, avant, après et y compris, la correspondance avec une seule commande?

leeand00
la source

Réponses:

21

Tu y es presque; vous pouvez également spécifier une plage de lignes, qui se présente sous la forme de [line1],[line2][command], au lieu de juste [line][command](comme vous l'utilisez maintenant).

Vous pouvez utiliser .pour faire référence à la ligne actuelle.

  • Pour la ligne actuelle et suivante: :g/match/.,+1d
  • Pour la ligne actuelle et précédente: :g/match/-1,.d
  • Pour la ligne précédente, actuelle et suivante: :g/match/-1,+1d

Voir :help [range]pour plus d'informations, et dans cette réponse, il y a quelques autres exemples .

Martin Tournoij
la source
La syntaxe est-elle la même dans sed?
leeand00
3
@ leeand00 Non. Il suffit d' :gexécuter une commande ex sur les lignes qui correspondent à un modèle. Donc, taper :g/match/.,+1dserait exactement la même chose qu'aller à toutes les lignes avec matchet taper:.,+1d
Martin Tournoij
C'est la chose la plus cool que j'ai apprise sur vim depuis un moment. Merci d'avoir partagé!
lps