web-dev-qa-db-fra.com

Comment puis-je supprimer toutes les lignes d'un fichier à l'aide de vi?

Comment puis-je supprimer toutes les lignes d'un fichier à l'aide de vi?

À l'heure actuelle, je fais cela en utilisant quelque chose comme ça pour supprimer toutes les lignes d'un fichier:

echo > test.txt

Comment puis-je supprimer toutes les lignes à l'aide de vi?

Remarque: Utiliser dd n'est pas une bonne option. Il peut y avoir plusieurs lignes.

285
Cold

Dans vi do

:1,$d

pour supprimer toutes les lignes.

Le : introduit une commande (et déplace le curseur vers le bas).
Le 1,$ indique les lignes sur lesquelles la commande suivante (d) doit fonctionner. Dans ce cas, la plage de la ligne un à la dernière ligne (indiquée par $, vous n'avez donc pas besoin de connaître le nombre de lignes dans le document).
Le dernier d signifie supprimer les lignes indiquées.

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

501
Anthon

Dans vi j'utilise

:%d

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

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
182
Archemar

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

> test.txt

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

  • 1G (passez à la première ligne)
  • dG (supprimer jusqu'à la dernière ligne)
55
Chris Down

Si votre curseur se trouve sur la première ligne (sinon, tapez: gg ou 1G), alors vous pouvez simplement utiliser dG. Il supprimera toutes les lignes de la ligne actuelle jusqu'à la fin du fichier. Donc, pour vous assurer que vous supprimerez toutes les lignes du fichier, vous pouvez mélanger les deux ensemble, ce qui serait: ggdG (en mode commande).

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

Connexes: Comment puis-je supprimer dans VIM tout le texte de la ligne actuelle à la fin du fichier?

30
kenorb

Je suis un mec paresseux et j'aime rester simple. ggdG est composé de cinq touches, dont Shift

gg va à la première ligne du fichier, d est le début du verbe delete et G est le mouvement pour aller au bas du fichier. En clair, c'est aller au début du fichier et tout supprimer jusqu'à la fin de la tuile.

27
TankorSmash

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

12
cppcoder

J'utilise toujours ggVG

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

Ensuite, vous pouvez simplement appuyer sur d ou x pour supprimer toutes les lignes.

5
yegle

Une autre solution:

truncate -s 0 file
4
slawx

notez que dans votre question, echo > test.txt crée un fichier avec un seul saut de ligne, pas un fichier vide.

À partir du shell, envisagez d'utiliser echo -n > test.txt ou : > 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 suit:

:!:>%

C'est presque aussi concis que ggdG, mais plus difficile à taper, et vous devez également confirmer que vous souhaitez recharger le fichier modifié, donc je ne le recommande pas particulièrement dans ce cas, mais sachant comment utiliser Shell les commandes de vi comme celle-ci sont utiles.

le décomposer:

  • : lancer une commande vi
  • ! lancer une commande Shell
  • : ceci est une commande intégrée de Shell avec une sortie vide
  • > redirige la sortie
  • % vi le remplace par le nom du fichier courant

Le :1,$d est aussi un bon bien sûr, et juste pendant que j'y suis, il y a aussi 1GdG

3
mc0e

Tapez : et %d

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

1
DimiDak