2012-05-17 41 views
6

Me gustaría eliminar el contenido de todas las líneas entre dos columnas. ¿Cómo hago esto?¿Cómo eliminar texto de todas las líneas entre dos columnas?

Por ejemplo, quiero esto:

abcdefg 
hijklmn 
opqrstu 

Para llegar a ser esto si elimino texto entre las columnas 3 a 5:

abfg 
himn 
optu 
+0

Para todas las líneas o solo para la línea actual? – Jeremy

+0

para todas las líneas, también quiero saber para la línea 80 a la línea 90 –

+0

Actualicé su pregunta con un ejemplo. ¿Podría asegurarse de que sea precisa? Los números que te interesan son irrelevantes. – Jeremy

Respuesta

15

Coloque el cursor en D, a continuación, pulse Ctrl-V, l, G y d.

  • Ctrl-v entra en el modo de bloque visual;
  • l amplía la selección visual un carácter a la derecha;
  • G amplía la selección a la última línea;
  • d elimina la selección.
+1

Es mejor hacer primero 'G' y luego' l' porque es posible que tenga que volver a 'l' si' G' aterriza en una línea vacía. – Lumi

+0

Agradable pero desafortunadamente con vim 7.4.903+, la 'G' expande la selección al final del archivo y a la izquierda del archivo. Entonces, en el ejemplo original, todos los personajes se eliminarían a la izquierda. En cambio, deberá usar la tecla 'l' para asegurarse de que el área resaltada sea el área que desea eliminar. – timbo

4

Para la edición espontánea, me gustaría utilizar el modo visual a modo de bloques a través de CTRL-V (frecuencia asignada a CTRL-Q en Windows), entonces d para eliminarlo.

Si hace esto a menudo, para un rango grande/todo el búfer, o repetidamente, usaría una sustitución que comienza a coincidir en una columna virtual, y se extiende (arriba) a la columna final, como en su ejemplo:

%s/\%3v.*\%<7v// 
3

puede utilizar búsqueda y reemplazo:

:%s/..\zs...\ze 

o en una forma más general:

:%s/.\{2}\zs.\{3}\ze 

donde el primer número (2) es el índice de la columna (basado en cero) y el segundo número (3) es el número de caracteres que tiene la columna.

Explicación:

:%s/ de búsqueda y reemplazo en todo el búfer.

.\{2}\zs encuentra dos caracteres y establece el comienzo de la coincidencia aquí.

.\{3}\ze encuentra tres caracteres y establece el final del partido aquí.

Omita la cadena de reemplazo ya que desea eliminar la coincidencia.

HTH

+0

Su solución se basa en caracteres, no en columnas. Esto difiere para caracteres de doble ancho (por ejemplo, chino), , y caracteres no imprimibles como^P (CTRL-P). –

+0

@IngoKarkat Tienes razón. No leí toda tu respuesta (me detuve después de leer CTRL-V). +1 por tu respuesta. – Tassos

4

Su pregunta es muy similar a this one.

Para eliminar las columnas 3 a 5 para todas las líneas en el archivo de:

:%normal 3|d6| 

Con el fin de eliminar un intervalo de línea específico (80 a 90), utilice este:

:80,90normal 3|d6| 

Si no está familiarizado con el comando normal ni con el | "Movimiento" ahí va una explicación rápida:

  1. El comando normal ejecutar los siguientes comandos en el modo normal;
  2. The | "movimiento" mueve el cursor a una columna especificada, por lo que 3| mueve el cursor a la tercera columna;
  3. Luego borro todo (d) hasta la quinta columna (6|).
0

que haría de la siguiente manera:

:%s/^..\zs.*\ze..$//g 

que eliminará todo lo demás aparte primeras dos columnas en la salida, y dos al final.

Cuestiones relacionadas