Come posso eliminare tutte le righe di un file usando vi?


269

Come posso eliminare tutte le righe di un file usando vi?

Al momento lo faccio usando qualcosa di simile per rimuovere tutte le righe in un file:

echo > test.txt

Come posso eliminare tutte le righe usando vi?

Nota: l' utilizzo ddnon è una buona opzione. Possono esserci molte righe.


5
Penso che dG dovrebbe funzionare.
MadTux,

11
@MadTux, solo se inizi sulla prima riga. 1GdGfunzionerebbe da qualsiasi luogo.
Holloway,

1
echo | test.txtnon è un comando valido, a meno che non test.txtsia uno script eseguibile. Suppongo che intendi echo >test.txtinvece?
Tripleee

Hai ragione @tripleee
Cold

5
Si noti che non utilizzando vi, >test.txtè sufficiente per troncarlo a lunghezza zero - non echonecessario.
circa

Risposte:


473

Nel vifare

:1,$d

per eliminare tutte le righe.

Il :introduce un comando (e sposta il cursore verso il basso).
L' 1,$indicazione di quali righe ddovrebbe funzionare il seguente comando ( ). In questo caso, l'intervallo va dalla riga 1 all'ultima riga (indicata da $, quindi non è necessario conoscere il numero di righe nel documento).
Il finale dsta per eliminare le righe indicate.

C'è una forma più breve ( :%d) ma mi ritrovo a non usarla mai. La :1,$dpuò essere più facilmente "atto", ad esempio, :4,$-2dlasciando solo le prime 3 e le ultime 2, eliminando il resto.


9
Suggerimento professionale. Non piùESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5,

2
@ rdev5 prova la .prossima volta a ripetere un comando
Gazihan Alankus il

169

In vi uso

:%d

dove

  • : dice a vi di andare in modalità comando
  • % significa tutte le linee
  • d : Elimina

Sulla riga di comando,

> test.txt

farà anche.

Qual è il problema con dd?

dd if=/dev/null of=test.txt

dove

  • /dev/null è un file speciale a 0 byte
  • if è il file di input
  • of è il file di output

Stavo pensando che usando ddho bisogno di pess per ogni riga del file.
Freddo,

Buono. E 'più semplice di quanto mi aspettassi ...
freddo

11
È necessario distinguere tra ddil comando vi (che significava OP) e ddl'utilità, di cui si fornisce un esempio. Inoltre, > test.txtpotrebbe non funzionare come previsto nelle shell non bash (ad es. Zsh).
depquid

1
@depquid Oups! ora ci penso ...
Archemar,

2
O : >test.txtche è solo leggermente più lungo.
Tripleee,

53

Ti consiglierei di farlo (dovrebbe funzionare in qualsiasi shell conforme a POSIX):

> test.txt

Se vuoi davvero farlo con vi, puoi fare:

  • 1G (vai alla prima riga)
  • dG (cancella all'ultima riga)

30
@Cold: ... una volta?
Chris Down,

5
Grappresenta l'ultima riga. Se sei sulla prima riga ( gg), dGdice a vi di rimuovere tutte le righe dalla riga corrente (prima riga) all'ultima riga. Quindi, lo fai in un colpo solo.
Unxnut,

6
ggè specifico per vim. È 1Gin vi tradizionale.
Stéphane Chazelas,

1
La sintassi della shell dipende dalla configurazione di alcune shell. Entrambe le shell interattive bash e zsh (zsh di default) possono attendere l'input su STDIN dopo aver ricevuto quel comando ed è necessario un ulteriore <CTRL> + D per cancellare effettivamente il file. La possibilità di eseguire ciò dipende anche dalle impostazioni di CLOBBER. >| test.txt < /dev/nullè un po 'più robusto in quanto bloccherà sempre il file ed eviterà di attendere l'input sui terminali interattivi.
Caleb,

1
@Caleb: Come ho detto, in qualsiasi shell conforme a POSIX . :-) Nessuna di queste due situazioni è una lamentela POSIX.
Chris Down,

28

Se il cursore si trova sulla prima riga (in caso contrario, digita: ggo 1G), puoi semplicemente usare dG. Eliminerà tutte le righe dalla riga corrente fino alla fine del file. Quindi, per essere sicuro di eliminare tutte le righe dal file, puoi mescolarle entrambe, che sarebbe: ggdG(mentre sei in modalità comando).

O %din modalità Ex, ad esempio da riga di comando: vim +%d foo.bar.

Correlati: Come posso eliminare in VIM tutto il testo dalla riga corrente alla fine del file?


3
+1 per essere più ergonomico di: 1, $ d. Non che le nostre dita non siano cablate per digitare i due punti in ogni momento, comunque;)
Aaron R.

2
Upvoted. dGè quello che uso sempre.
lunchmeat317

1
Trovo questo ( ggdG) il metodo più semplice in vim. Il motivo per cui questa risposta non è stata votata come gli altri è che ggnon esiste in vi puro?
Thameera,

27

Sono un tipo pigro e mi piace mantenerlo semplice. ggdGsono cinque battute incluseShift

ggva alla prima riga del file, dè l'inizio del dverbo elete ed Gè il movimento per andare in fondo al file. Verosimilmente, va all'inizio del file ed elimina tutto fino alla fine del riquadro.


rsrs. Sono anche pigro e uso :$do :1,$dè il modo più veloce (scrivo meno personaggi) kkk
Cold

3
:%dè una buona alternativa, poiché in questo modo si utilizzano solo 5 battute.
TankorSmash,

1
@TankorSmash ggè un vimcomando, non vi.
kyrias,

buona cattura, mio ​​errore
TankorSmash


5

Lo uso sempre ggVG

  • gg passa all'inizio del file di modifica corrente
  • V(v maiuscola) selezionerà la riga corrente. In questo caso, la prima riga del file di modifica corrente
  • G(g maiuscolo) salterà alla fine del file. In questo caso, poiché ho selezionato la prima riga, Gselezionerò l'intero testo in questo file.

Quindi puoi semplicemente premere do xper eliminare tutte le righe.


Se si utilizza in dverticale, si applica automaticamente in linea. dlelimina un carattere a destra dj, ad esempio una riga in basso.
TankorSmash,

3

nota che nella tua domanda, echo > test.txtcrea un file con una sola interruzione di riga, non un file vuoto.

Dalla shell, considera l'utilizzo di echo -n > test.txto : > test.txt.

Mentre generalmente userei un comando di modifica vi (io uso ggdG), puoi anche chiamare la shell con un riferimento al file corrente in questo modo:

:!:>%

È quasi conciso come ggdG, ma più difficile da digitare, e devi anche confermare che vuoi ricaricare il file modificato, quindi non lo consiglio particolarmente in questo caso, ma sapere come usare i comandi di shell di vi in ​​questo modo è utile.

abbattendolo:

  • : avvia un comando vi
  • ! avvia un comando di shell
  • : questo è un comando incorporato della shell con output vuoto
  • > reindirizzare l'output
  • % vi sostituisce questo con il nome del file corrente

Anche il suggerito :1,$dè buono, ovviamente, e proprio mentre ci sono io c'è anche1GdG


:!:>%è anche pericoloso in quanto vinon sfugge al nome del file per la shell (non farlo quando si modifica un file chiamato $(reboot)ad esempio). Avresti bisogno di qualcosa:call system(":>" . shellescape(expand("%")))
Stéphane Chazelas il

3

Un'altra soluzione:

truncate -s 0 file

Non molto più semplice di, >filema OK.
phk,

1
Sembra essere un buon metodo, ma l'obiettivo lo sta facendo usando vi. Tks
Freddo,


-1

Puoi usare un trucco per eliminare un gran numero di righe. Assicurati di non essere in modalità inserimento (premi ESC) quindi digita 1000dd.


1
Dovresti includere la spiegazione su cosa fa il comando / come funziona (elimina le successive 1000 righe, che non cancella tutte le linee se il cursore non si trova sulla prima riga).
sebasth,

ecco perché l'ho chiamato un trucco :)
Radu,

-1

Scrivo ggper raggiungere la cima delle righe e poi faccio un 100 dd. Questo porta il puntatore alla prima riga dell'editor e cancella 100 righe da lì. Potrebbe essere necessario modificare il numero per aggiungere più righe se il file è più lungo.


-1
> file.txt

Non devi nemmeno aprire vi a meno che tu non voglia davvero.


1
Ciao e benvenuto nel sito di scambio di stack U&L. Si prega di consultare il centro assistenza per informazioni su come pubblicare al meglio questo sito. Vogliamo coltivare domande e risposte informative e uniche su questo sito. La tua risposta è identica ad altre risposte e commenti su questo post. Si prega di modificare il tuo post per essere una risposta più unico e informativo per favore. Grazie!
kemotep

Inoltre, il punto della domanda è ... "usando vi"
Jeff Schaller

Ho provato esattamente quello che mi hai suggerito. Ho capito bash: > file.txt: command not found.
roaima,

@roaima Lo otterresti se citi la cosa come "> file.txt".
Kusalananda

1
@JeffSchaller : vi >file.txt ;-)
Kusalananda
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.