Editor vi: qual è il modo più veloce per eliminare più righe in un file?


12

Vorrei usare l'editor Vi per eliminare più righe in un file. Per favore, dammi un'idea o un suggerimento.

Il mio obiettivo è così:

Prima:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.
.
29
30
.
.

Dopo;

1
10
20
30
40
.
.

3
come hai scelto le righe da eliminare? Vuoi lasciare una riga ogni 10?
matzeri,

1
È possibile eliminare intervalli di linee con, :[range]dad esempio, :3,5delimina le linee da tre a cinque (inclusivamente).
Bratchley,

6
C'è anche vi.stackexchange .
Alexey,

@ R Ketkaew - Stai cercando di rimuovere un elenco di numeri o sono righe? Potresti aggiornare la tua domanda per chiarire?
DarkHeart,

So che stai chiedendo di Vi, ma puoi fare anche con GNU Sed:gsed -n '1p; 0~10p'
shadowtalker,

Risposte:


17

Se vuoi dire che vuoi mantenere ogni 10a riga ed eliminare il resto:

%norm 9ddj

Spiegazione:

% intero file

norm eseguire i seguenti comandi in "modalità normale"

9dd cancella 9 righe

j spostarsi di una riga (cioè tenerlo)

nota: questo cancella la prima riga.

Adattato da http://www.rayninfo.co.uk/vimtips.html


O usando il comando globale:

  • Duplica la prima riga ggYP
  • :g/^/+ d9

Adattato da /programming/1946738/vim-how-to-delete-every-second-row


Oppure potresti usare awk:

%!awk 'NR \% 10 == 0 || NR == 1'

Il comando awk funziona per me. Ho sempre pensato che Awk richiedesse almeno un blocco {...}. bello sapere che non lo fai. È il primo comando awk non banale che ho funzionato!
the_velour_fog

1
@the_velour_fog è richiesto il blocco . se non ne scrivi uno, AWK si comporterà come se avessi scritto{ print $0 }
shadowtalker il

@RKetkaew Quale delle opzioni hai usato? Se una risposta risolve la tua domanda, fai clic sul segno di spunta per contrassegnarla come risposta.
underscore_d

@underscore_d Ciao, ho usato un comando suggerito da DarkHeart. Grazie per i vostri commenti.
Rangsiman,

12
:2,$v/0$/d

cancella le linee che non finiscono con l' 0inizio dalla seconda.


2
Questa, questa è la soluzione intelligente. Aggiungerei solo una spiegazione che 2,$è l'intervallo e v/0$/dil g!comando. Dov'è 0$il regex e dil comando ex che verranno eseguiti su tutte le righe che non corrispondono.
grochmal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.