¿Eliminar un rango de n líneas antes y después de una línea coincidente?

12

Tengo un archivo de configuración repetitivo y me gustaría hacer coincidir una expresión regular y eliminar un rango de líneas antes y después de una coincidencia. También me gustaría eliminar la coincidencia en un comando.

Puedo usar...

:g/match/-1d

... varias veces para eliminar más de una línea antes de un partido ...

... y combinarlo con algunas llamadas a ...

:g/match/+1d

... para eliminar más de una línea después del partido ...

Pero, ¿hay alguna forma de eliminar un rango de líneas, antes, después e incluyendo la coincidencia con un comando?

leeand00
fuente

Respuestas:

21

Ya casi estás ahí; También puede especificar un rango de líneas, que tiene la forma de [line1],[line2][command], en lugar de solo [line][command](como lo está usando ahora).

Puede usar .para referirse a la línea actual.

  • Para la línea actual y siguiente: :g/match/.,+1d
  • Para la línea actual y anterior: :g/match/-1,.d
  • Para la línea anterior, actual y siguiente: :g/match/-1,+1d

Consulte :help [range]para obtener más información, y en esta respuesta hay algunos ejemplos más .

Martin Tournoij
fuente
¿La sintaxis es la misma en sed?
leeand00
3
@ leeand00 No. Todo lo que :ghace es ejecutar un comando ex en las líneas que coinciden con un patrón. Por :g/match/.,+1dlo tanto, escribir sería exactamente lo mismo que ir a todas las líneas matchy escribir:.,+1d
Martin Tournoij
Esto es lo mejor que he aprendido en vim en mucho tiempo. ¡Gracias por compartir!
lps