J'ai un certain nombre de lignes dans un fichier, et je voudrais copier chaque ligne 11 fois (en transformant chaque ligne en 12 lignes), et incrémenter le dernier "1" de chaque ligne afin que les 12 lignes aient "1" à " 12 ", où se trouvait initialement le" 1 ". Il peut y avoir d'autres occurrences de «1» dans chaque ligne, mais le «1» que je veux incrémenter sera toujours la dernière occurrence de chaque ligne. Une autre façon de voir les choses est que le dernier "1" est toujours après "/ nt /" - comme dans "/ nt / 1" (et ce sera toujours la seule occurrence de "/ nt / 1" dans chaque ligne) .
Ainsi, par exemple, si j'ai:
1stlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/1blah
3rdlineblahblahblah/nt/1blah
Je veux en faire:
1stlineblahblahblah/nt/1blah
1stlineblahblahblah/nt/2blah
1stlineblahblahblah/nt/3blah
1stlineblahblahblah/nt/4blah
1stlineblahblahblah/nt/5blah
1stlineblahblahblah/nt/6blah
1stlineblahblahblah/nt/7blah
1stlineblahblahblah/nt/8blah
1stlineblahblahblah/nt/9blah
1stlineblahblahblah/nt/10blah
1stlineblahblahblah/nt/11blah
1stlineblahblahblah/nt/12blah
2ndlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/2blah
2ndlineblahblahblah/nt/3blah
...
J'avais précédemment trouvé la commande:
:for i in range(0,12) | put ='1stlineblahblahblah/nt/'.i.'blah' | endfor
fonctionne à cet effet, mais je devrais exécuter manuellement cette commande pour chaque ligne et taper chaque ligne (ou la copier-coller) moi-même. Existe-t-il un moyen de prendre les lignes qui sont déjà dans le fichier et d'exécuter simplement une commande qui transforme chaque ligne en douze, de la manière que j'ai décrite?
Merci d'avance à tous ceux qui peuvent m'aider. Je tenais également à souligner qu'il s'agit de ma deuxième question ici, et j'étais heureux d'avoir obtenu plusieurs solutions rapides et efficaces à ma première question, pour lesquelles j'étais très reconnaissant.
la source
Vous pouvez le faire en
global
commande ex pour exécuter la macro n nombre de fois pour chaque ligne du fichier.Après avoir enregistré la macro, annulez les modifications effectuées pendant l'enregistrement, sinon il y aura n + 1 lignes supplémentaires pour la première ligne et n pour les lignes consécutives.
Enregistrez la macro dans le
a
registre avecCela enregistre dans register
a
(qa...q
) la commande suivante:yyp
: dupliquer la ligne courante$
: passer à la fin de la ligne?\d<CR>
: recherche en arrière d'un seul chiffre<C-A>
: incrémente le chiffre sous le curseur de unLorsque la macro est enregistrée, supprimez les modifications apportées lors de son enregistrement en annulant (
uu
) ou en supprimant la ligne actuelle (dd
). Répétez ensuite la macro11
(ou n'importe quel nombre de fois) pour chaque ligne du fichier avec la commande globale:la source
Deux façons:
Utilisez une macro!
Commençant par
Avec votre curseur sur la première ligne
Qui fait:
qq
Commencer à enregistrer une macro dans le registre qyyp
tirez sur la ligne actuelle et collez-la ci-dessous$?\d<CR>
Allez à la fin de la ligne et trouvez le premier chiffre en regardant en arrière<Ctrl-a>
Augmentez le nombreq
Arrêtez l'enregistrement de la macro.Cela vous laisse avec:
Avec le curseur sur la deuxième ligne. Répétez simplement cette macro autant de fois que vous le souhaitez (par exemple, répétez-la dix fois avec 10 @ q). Si vous souhaitez automatiser ce processus pour chaque ligne, exécutez-le globalement sur chaque ligne:
:g//normal 11@q
Alternativement, avec une version plus récente de vim: collez la ligne de votre choix autant de fois, bloc visuel sélectionnez le chiffre que vous souhaitez incrémenter et appuyez sur
g <Ctrl-a>
. Cela devrait incrémenter tous les nombres du bloc visuel comme vous le souhaitez. Il s'agit cependant d'un processus plus manuel.la source
g <c-a>
chemin. Merci d'avoir partagé.Je trouve plus facile d'utiliser des macros pour des tâches ponctuelles comme celle-ci. Commencez simplement à enregistrer une macro avec
q
+ nom du registre et effectuez la tâche une fois. Je vois une tâche reproductible ici:Enregistrez maintenant les frappes nécessaires pour vous inscrire
a
, en mode normal:Supprimez à nouveau la ligne pour tester si l'exécution de la macro 11 fois donne le bon résultat pour une ligne:
Cela fait! Permet donc d'annuler à nouveau et d'automatiser l'ensemble du processus dans une deuxième macro
b
:Vous pouvez maintenant exécuter
@b
jusqu'à la fin du fichier et cela devrait produire la sortie que vous souhaitez. Cela semble compliqué, mais ce n'est vraiment pas une fois que vous êtes habitué aux modèles d'édition typiques.la source
qaVyp$b<c-a>
. Ou mieux, justeqayyp$b<c-a>
.qqyyp$?\d<CR><Ctrl-a>q
de @fruglemonkey et @jjaderberg est meilleure car elle recherche le dernier numéro. Je le changerai pour être complet.Enregistrez la macro suivante et utilisez-la pour chaque ligne:
La principale différence par rapport aux autres réponses est que cela fait appel
g<C-a>
à une sélection de colonnes qui incrémente chaque ligne avec un numéro différent. Vérifiez:help v_g_CTRL-A
pour plus d'informations. J'ai également utilisé\zs
pour sélectionner la position de départ du motif, de sorte que le curseur s'arrête au numéro après la recherche.Veuillez noter que vous avez besoin d'une version récente de Vim pour que cela fonctionne.
la source
g<C-a>
@fruglemonkey auquel vous avez fait référence, mais merci d'avoir répondu. Je dois noter que lorsque vous essayez votre macro - juste avant d'arriver à lag<C-a>
partie, ce n'est pas le dernier caractère "1" que je cherche à incrémenter qui est mis en surbrillance, mais c'est plutôt le caractère avant le premier "1" "caractère mis en surbrillance. (En outre, je pense que cela aurait dû êtreyy11p
et10j
dans la macro, car je cherche à ajouter 11 lignes - pour un total de 12.)\zs
, mais j'aurais tout aussi bien pu ajouter unl
après<CR>
.vim -u NONE
. Je viens de le faire et cela fonctionne parfaitement! En fait, il n'y a aucun moyen que la recherche corresponde au premier 1 car elle nécessite une barre oblique précédente.