2012-05-17 8 views
6

Vorrei rimuovere il contenuto per tutte le linee tra due colonne. Come faccio a fare questo?Come rimuovere il testo da tutte le linee tra due colonne?

Per esempio, io voglio questo:

abcdefg 
hijklmn 
opqrstu 

Per diventare questo se rimuovere il testo tra le colonne da 3 a 5:

abfg 
himn 
optu 
+0

Per tutte le linee o solo la riga corrente? – Jeremy

+0

per tutte le linee, voglio anche sapere per la linea 80 alla riga 90 –

+0

Ho aggiornato la tua domanda con un esempio. Potresti assicurarti che sia accurato? I numeri che ti interessano sono irrilevanti. – Jeremy

risposta

15

Posizionare il cursore in d, quindi premere Ctrl-V, l, G e d.

  • Ctrl-v entra in modalità di blocco visiva;
  • l espande la selezione visiva di un carattere a destra;
  • G espande la selezione fino all'ultima riga;
  • d elimina la selezione.
+1

È meglio fare prima 'G' e poi' l' perché potresti dover ripetere 'l' se' G' ti atterra su una linea vuota. – Lumi

+0

Bello ma sfortunatamente con vim 7.4.903+, il 'G' espande la selezione in fondo al file e alla sinistra del file. Quindi, nell'esempio originale, tutti i personaggi sarebbero stati rimossi a sinistra. Invece, dovrai usare il tasto 'l' per assicurarti che l'area evidenziata sia l'area che vuoi rimuovere. – timbo

4

Per l'editing spontanea, vorrei utilizzare la modalità visiva a blocchi tramite CTRL-V (spesso mappato a CTRL-Q su Windows), quindi d per eliminarlo.

Se lo si fa spesso, per una vasta gamma/l'intero buffer, o più volte, vorrei utilizzare una sostituzione che inizia a corrispondere in una colonna virtuale e si estende (su) alla colonna finale, come per il proprio esempio:

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

È possibile utilizzare la ricerca e sostituzione:

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

o in una forma più generale:

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

dove il primo numero (2) è l'indice della colonna (a base zero) e il secondo numero (3) è il conteggio dei caratteri della colonna.

Spiegazione:

:%s/ ricerca e sostituzione in tutto il buffer.

.\{2}\zs trovare due caratteri e impostare l'inizio della partita qui.

.\{3}\ze trovare tre caratteri e impostare la fine della partita qui.

Omettere la stringa di sostituzione poiché si desidera eliminare la corrispondenza.

HTH

+0

La soluzione è basata sui caratteri, non sulla colonna. Differisce per caratteri a doppia larghezza (ad esempio cinese), e caratteri non stampabili come^P (CTRL-P). –

+0

@IngoKarkat Hai ragione. Non ho letto tutta la tua risposta (mi sono fermato dopo aver letto CTRL-V). +1 per la tua risposta. – Tassos

4

La sua domanda è molto simile a this one.

Per eliminare le colonne 3 a 5 per tutte le righe nel file:

:%normal 3|d6| 

Per eliminare un intervallo specifica linea (da 80 a 90), utilizzare questo:

:80,90normal 3|d6| 

Se non si ha familiarità con il normale comando né con il comando | "Motion" ci va un breve spiegazione:

  1. Il comando normal eseguire i seguenti comandi nella normale modalità ;
  2. Il | "motion" sposta il cursore su una colonna specificata, quindi 3| sposta il cursore sulla terza colonna;
  3. Quindi si elimina tutto (d) fino alla quinta colonna (6|).
0

avrei fatto nel modo seguente:

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

che rimuoverà tutto il resto a parte prime due colonne in partenza, e due alla fine.

Problemi correlati