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 dd
n'est pas une bonne option. Il peut y avoir beaucoup de lignes.
1GdG
travaillerait de n'importe où.echo | test.txt
n'est pas une commande valide, sauf s'iltest.txt
s'agit d'un script exécutable. Je suppose que tu veux dire à laecho >test.txt
place?vi
,>test.txt
est suffisant pour le tronquer à une longueur nulle - pasecho
nécessaire.Réponses:
En
vi
dosupprimer 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
d
signifie supprimer les lignes indiquées.Il existe une forme plus courte (
:%d
) mais je me trouve ne jamais l'utiliser. Le:1,$d
peut être plus facilement "adapté" pour:4,$-2d
ne laisser, par exemple, que les 3 premières et les 2 dernières lignes, en supprimant le reste.la source
ESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
.
prochaine fois de répéter une commandeEn vi j'utilise
où
:
indique à vi de passer en mode commande%
signifie toutes les lignesd
: effacerSur la ligne de commande,
fera aussi.
Quel est le problème avec dd?
où
/dev/null
est un fichier spécial de 0 octetif
est le fichier d'entréeof
est le fichier de sortiela source
dd
je devais utiliser pess pour chaque ligne du fichier.dd
la commande vi (ce que l’opérateur a voulu dire) etdd
l’utilitaire, dont vous donnez un exemple. De plus,> test.txt
peut ne pas fonctionner comme prévu dans les shells non bash (par exemple, zsh).: >test.txt
qui n'est que très légèrement plus long.Je vous recommande simplement de faire ceci (devrait fonctionner dans n'importe quel shell compatible POSIX):
Si vous voulez vraiment le faire avec vi, vous pouvez faire:
la source
G
représente la dernière ligne. Si vous êtes sur la première ligne (gg
),dG
indique à 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.gg
est spécifique à vim. C'est1G
en vi traditionnel.>| test.txt < /dev/null
est un peu plus robuste car cela encombrera toujours le fichier et évitera d'attendre les entrées sur des terminaux interactifs.Si votre curseur est sur la première ligne (sinon, tapez:
gg
ou1G
), vous pouvez simplement utiliserdG
. 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
%d
en 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?
la source
dG
est ce que j'utilise toujours.ggdG
) la méthode la plus simple dans vim. La raison pour laquelle cette réponse n'est pas votée comme les autres estgg
-ce inexistant en vi pur?Je suis un mec paresseux et j'aime garder les choses simples.
ggdG
est cinq frappes, y comprisShift
gg
va à la première ligne du fichier,d
est le début dud
verbe elete etG
le mouvement pour aller au bas du fichier. Verbosely, allez au début du fichier et supprimez tout jusqu'à la fin de la mosaïque.la source
:$d
ou:1,$d
est le moyen le plus rapide (j'écris moins de caractères) kkk:%d
C'est une bonne alternative, puisque vous n'utilisez que 5 frappes de cette façon aussi.gg
est unevim
commande, pasvi
.Allez au début du fichier et appuyez sur dG.
la source
J'utilise toujours
ggVG
gg
saute au début du fichier en cours d'éditionV
(v majuscule) sélectionnera la ligne en cours. Dans ce cas, la première ligne du fichier en cours d'éditionG
(g en majuscule) passera à la fin du fichier. Dans ce cas, puisque j'ai sélectionné la première ligne,G
je sélectionnerai tout le texte de ce fichier.Ensuite, vous pouvez simplement appuyer sur
d
oux
pour supprimer toutes les lignes.la source
d
verticalement, il s’applique automatiquement ligne par ligne.dl
supprime un caractère à droite,dj
supprime une ligne vers le bas, par exemple.Notez que dans votre question,
echo > test.txt
crée un fichier avec une simple rupture de ligne, pas un fichier vide.À partir de la coque, 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 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 coursLe suggéré
:1,$d
est aussi un bon bien sûr, et juste pendant que je suis à cela, il y a aussi1GdG
la source
:!:>%
est également dangereux carvi
n'é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("%")))
Une autre solution:
la source
>file
mais bon.Type
:
et%d
(Pas en mode insertion. Si c'est le cas, appuyez d'abord sur échap.)
la source
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.
la source
Je tape
gg
pour atteindre le haut des lignes puis fais un100 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.la source
Vous n'êtes même pas obligé d'ouvrir vi à moins que vous ne le souhaitiez vraiment.
la source
bash: > file.txt: command not found
."> file.txt"
.: vi >file.txt
;-)