Comment puis-je supprimer toutes les lignes d'un fichier avec vi?

269

Comment puis-je supprimer toutes les lignes d'un fichier avec vi?

Au moment où je fais cela en utilisant quelque chose comme ceci pour supprimer toutes les lignes d'un fichier:

echo > test.txt

Comment puis-je supprimer toutes les lignes avec vi?

Remarque: l' utilisation ddn'est pas une bonne option. Il peut y avoir beaucoup de lignes.

Du froid
la source
5
Je pense que dG devrait fonctionner.
MadTux
11
@MadTux, uniquement si vous démarrez sur la première ligne. 1GdGtravaillerait de n'importe où.
Holloway
1
echo | test.txtn'est pas une commande valide, sauf s'il test.txts'agit d'un script exécutable. Je suppose que tu veux dire à la echo >test.txtplace?
triple-
Vous avez raison @ tripleee
froid
5
Notez que ne pas utiliser vi, >test.txtest suffisant pour le tronquer à une longueur nulle - pas echonécessaire.
Abligh

Réponses:

473

En vido

:1,$d

supprimer toutes les lignes.

Le :introduit une commande (et déplace le curseur vers le bas).
Le 1,$est une indication des lignes sur lesquelles la commande suivante ( d) devrait fonctionner. Dans ce cas, la plage allant de la première ligne à la dernière ligne (indiquée par $, vous n'avez donc pas besoin de connaître le nombre de lignes du document).
La finale dsignifie supprimer les lignes indiquées.

Il existe une forme plus courte ( :%d) mais je me trouve ne jamais l'utiliser. Le :1,$dpeut être plus facilement "adapté" pour :4,$-2dne laisser, par exemple, que les 3 premières et les 2 dernières lignes, en supprimant le reste.

Anthon
la source
9
Pro tip. Pas plusESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5
2
@ rdev5 essaie la .prochaine fois de répéter une commande
Gazihan Alankus
169

En vi j'utilise

:%d

  • : indique à vi de passer en mode commande
  • % signifie toutes les lignes
  • d : effacer

Sur la ligne de commande,

> test.txt

fera aussi.

Quel est le problème avec dd?

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

  • /dev/null est un fichier spécial de 0 octet
  • if est le fichier d'entrée
  • of est le fichier de sortie
Archemar
la source
Je pensais que ddje devais utiliser pess pour chaque ligne du fichier.
Froid
Bien. C'est plus simple que ce
Froid
11
Vous devez faire la distinction entre ddla commande vi (ce que l’opérateur a voulu dire) et ddl’utilitaire, dont vous donnez un exemple. De plus, > test.txtpeut ne pas fonctionner comme prévu dans les shells non bash (par exemple, zsh).
Envoyé
1
@dupquid Oups! maintenant j'y pense ...
Archemar
2
Ou : >test.txtqui n'est que très légèrement plus long.
Tripleee
53

Je vous recommande simplement de faire ceci (devrait fonctionner dans n'importe quel shell compatible POSIX):

> test.txt

Si vous voulez vraiment le faire avec vi, vous pouvez faire:

  • 1G (aller à la première ligne)
  • dG (effacer jusqu'à la dernière ligne)
Chris Down
la source
30
@Cold: ... une fois?
Chris Down
5
Greprésente la dernière ligne. Si vous êtes sur la première ligne ( gg), dGindique à vi de supprimer toutes les lignes de la ligne en cours (première ligne) à la dernière ligne. Donc, vous le faites en un coup.
unxnut
6
ggest spécifique à vim. C'est 1Gen vi traditionnel.
Stéphane Chazelas
1
Votre syntaxe de shell dépend de la configuration de certains shells. Les shells interactifs bash et zsh (zsh par défaut) peuvent attendre l'entrée sur STDIN après avoir reçu cette commande. Un <CTRL> + D supplémentaire est nécessaire pour effacer réellement le fichier. La possibilité de l'exécuter dépend également des paramètres CLOBBER. >| test.txt < /dev/nullest un peu plus robuste car cela encombrera toujours le fichier et évitera d'attendre les entrées sur des terminaux interactifs.
Caleb
1
@Caleb: Comme je l'ai dit, dans n'importe quel shell compatible POSIX . :-) Aucune de ces deux situations ne constitue une plainte pour POSIX.
Chris Down
28

Si votre curseur est sur la première ligne (sinon, tapez: ggou 1G), vous pouvez simplement utiliser dG. Il supprimera toutes les lignes de la ligne en cours jusqu'à la fin du fichier. Donc, pour vous assurer de supprimer toutes les lignes du fichier, vous pouvez mélanger les deux, ce qui serait: ggdG(en mode commande).

Ou %den mode Ex, exemple de ligne de commande: vim +%d foo.bar.

Connexe: Comment supprimer dans VIM tout le texte de la ligne actuelle à la fin du fichier?

Kenorb
la source
3
+1 pour être plus ergonomique que: 1, $ d. Non pas que nos doigts ne sont pas câblés pour taper le côlon tout le temps maintenant, en tout cas;)
Aaron R.
2
Upvote. dGest ce que j'utilise toujours.
lunchmeat317
1
Je trouve cela ( ggdG) la méthode la plus simple dans vim. La raison pour laquelle cette réponse n'est pas votée comme les autres est gg-ce inexistant en vi pur?
thameera
27

Je suis un mec paresseux et j'aime garder les choses simples. ggdGest cinq frappes, y comprisShift

ggva à la première ligne du fichier, dest le début du dverbe elete et Gle mouvement pour aller au bas du fichier. Verbosely, allez au début du fichier et supprimez tout jusqu'à la fin de la mosaïque.

TankorSmash
la source
rsrs. Je suis paresseux aussi et utilise :$dou :1,$dest le moyen le plus rapide (j'écris moins de caractères) kkk
Cold
3
:%dC'est une bonne alternative, puisque vous n'utilisez que 5 frappes de cette façon aussi.
TankorSmash
1
@TankorSmash ggest une vimcommande, pas vi.
Kyrias
bonne prise, mon erreur
TankorSmash
12

Allez au début du fichier et appuyez sur dG.

cppcoder
la source
5

J'utilise toujours ggVG

  • gg saute au début du fichier en cours d'édition
  • V(v majuscule) sélectionnera la ligne en cours. Dans ce cas, la première ligne du fichier en cours d'édition
  • G(g en majuscule) passera à la fin du fichier. Dans ce cas, puisque j'ai sélectionné la première ligne, Gje sélectionnerai tout le texte de ce fichier.

Ensuite, vous pouvez simplement appuyer sur dou xpour supprimer toutes les lignes.

Yegle
la source
Si vous utilisez dverticalement, il s’applique automatiquement ligne par ligne. dlsupprime un caractère à droite, djsupprime une ligne vers le bas, par exemple.
TankorSmash
3

Notez que dans votre question, echo > test.txtcrée un fichier avec une simple rupture de ligne, pas un fichier vide.

À partir de la coque, envisagez d’utiliser echo -n > test.txtou : > test.txt.

Bien que j'utilise généralement une commande d'édition vi (j'utilise ggdG), vous pouvez également appeler le shell avec une référence au fichier actuel, comme ceci:

:!:>%

Il est presque aussi concis que ggdG, mais plus difficile à taper, et vous devez également confirmer que vous souhaitez recharger le fichier modifié. Je ne le recommande donc pas particulièrement dans ce cas, mais savoir comment utiliser les commandes shell de vi comme ceci est utile.

le décomposer:

  • : lancer une commande vi
  • ! lancer une commande shell
  • : il s'agit d'une commande intégrée au shell avec une sortie vide
  • > rediriger la sortie
  • % vi le remplace par le nom du fichier en cours

Le suggéré :1,$dest aussi un bon bien sûr, et juste pendant que je suis à cela, il y a aussi1GdG

mc0e
la source
:!:>%est également dangereux car vin'échappe pas le nom du fichier pour le shell (ne le faites pas lors de l'édition d'un fichier appelé $(reboot)par exemple). Vous avez besoin de quelque chose:call system(":>" . shellescape(expand("%")))
Stéphane Chazelas
3

Une autre solution:

truncate -s 0 file
slawx
la source
Pas vraiment plus simple que >filemais bon.
phk
1
Cela semble être une bonne méthode, mais la cible le fait en utilisant vi. Tks
Cold
1

Type :et%d

(Pas en mode insertion. Si c'est le cas, appuyez d'abord sur échap.)

DimiDak
la source
Notez que cela a déjà été posté
Jeff Schaller
-1

Vous pouvez utiliser une astuce pour supprimer un grand nombre de lignes. Assurez-vous que vous n'êtes pas en mode insertion (appuyez sur ÉCHAP), puis tapez 1000dd.

Radu
la source
1
Vous devez inclure l'explication sur le fonctionnement / le fonctionnement de la commande (supprime les 1000 prochaines lignes, ce qui ne supprime pas toutes les lignes si le curseur ne se trouve pas sur la première ligne).
sebasth
c'est pourquoi j'ai appelé ça un tour :)
Radu
-1

Je tape ggpour atteindre le haut des lignes puis fais un 100 dd. Cela amène le pointeur sur la première ligne de l'éditeur et efface 100 lignes à partir de là. Vous devrez peut-être ajuster le nombre pour ajouter plus de lignes si le fichier est plus long.

Atul
la source
-1
> file.txt

Vous n'êtes même pas obligé d'ouvrir vi à moins que vous ne le souhaitiez vraiment.

ombre
la source
1
Bonjour et bienvenue sur le site d'échange de piles U & L. Consultez le centre d’aide pour obtenir des informations sur la meilleure publication de ce site. Nous voulons cultiver des questions et des réponses informatives et uniques sur ce site. Votre réponse est identique aux autres réponses et commentaires sur ce post. S'il vous plaît modifier votre message pour être une réponse plus unique et informative s'il vous plaît. Je vous remercie!
Kemotep
En outre, le but de la question est de ... "utiliser vi"
Jeff Schaller
J'ai essayé exactement ce que vous avez suggéré. Je suis arrivé bash: > file.txt: command not found.
Roaima
@ Raima Vous obtiendrez cela si vous citez la chose comme "> file.txt".
Kusalananda
1
@JeffSchaller : vi >file.txt ;-)
Kusalananda