Je veux créer un script Vim de base qui supprime simplement n lignes, saute 1 ligne et se répète jusqu'à la fin du document. Je ne me soucie pas des correspondances spécifiques, je veux juste supprimer la ligne. Par exemple; Je veux donc répéter la commande 3ddj
pour tout le document.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
On dirait donc ...
Text I want to keep.
Text I want to keep.
Text I want to keep.
Je vous remercie.
regular-expression
normal-mode
repeated-commands
Max Copley
la source
la source
regular-expression
sur votre question, mais la question ne semble pas indiquer de raison de le faire avec des expressions régulières. Si vous recherchez réellement quelque chose qui utilise des expressions régulières, stackoverflow.com/questions/17735289/… peut être intéressant. Cette question concernait le Bloc-notes ++, mais la réponse n'utilise rien d'autre qu'une expression régulière pcre. (Avertissement: j'ai écrit cette réponse.)Réponses:
Approche très simple:
qa3ddjq
La troisième étape répétera la macro mille fois ou jusqu'à ce qu'une erreur se produise. Frapper la fin du fichier (donc pas de lignes à supprimer) produit une erreur et la répétition de la macro est annulée.
Tu vois
:help recording
.la source
q
(en mode commande, et dans vim ou d'autres versions alternatives récentes [neovim, etc.], mais pas dans le vi original) signifie "commencer l'enregistrement, et le mettre dans le tampon" lettre suivante "". donc:qa
signifie "commencer l'enregistrement dans le tampon" a "". Ensuite, toutes les touches tapées après cela (jusqu'à la prochaineq
en mode commande) sont enregistrées (vous pouvez même enregistrer: passer en mode édition, taper quelque chose, s'échapper en mode commande, etc.). Puis12@a
répéterait toutes les mesures ont été enregistrées dans le tampon « a » 12 fois.1000@q
à la fin, vous pouvez créer une macro récursive:,qa3ddj@aq@a
bien que vous deviez d'qaq
abord le faire pour vous assurer que le"a
démarrage est vide.La solution la plus simple pour moi serait:
C'est:
%
: pour chaque lignenorm
: exécutez les touches suivantes comme en mode normalj3dd
: descendre en ligne puis supprimer 3 lignesDonc, à partir de la première ligne, descendez à la seconde et supprimez les 3 lignes suivantes. Le second
Text I want to keep.
est maintenant sur la deuxième ligne. Descendez d'une ligne, supprimez 3. Rincez et répétez.Remarque: si vous ne souhaitez pas traiter l'intégralité du fichier, vous pouvez remplacer le
%norm
par exemple5,$norm
pour traiter de la 5e ligne à la fin du fichier.la source
Vous avez déjà d'excellentes solutions. En voici un autre:
Tout d'abord, nous effectuons une action sur chaque ligne (
:g
correspondant au^
(début de la ligne)) et pour chaque numéro de ligne effectuons le résultat delinenumber % 4
. Si le résultat est différent de1
, nous ajoutonsDELETE ME
au début de la ligne, marquant les lignes à supprimer par la commande suivante.La commande suivante est une commande regular (
:g
), qui correspond à toutes les lignes commençant parDELETE ME
et le fait.Remarque, vous ne pouvez pas supprimer immédiatement la ligne à l'aide de la première
:g
commande, car cela modifierait le calcul modulo résultant et en tant que tel, nous devons d'abord marquer les lignes et, dans un deuxième temps, le supprimer.la source
Je sais que c'est la
vi
chaîne, mais pour moi, c'est unsed
problème.Vous pouvez donc le transformer en une
vi
solution:la source
Une alternative (je suppose que nous commençons sur la ligne 1, et supprimons les lignes 2-4, 6-8 et ainsi de suite, selon un exemple de texte):
Si vous préférez le faire de manière interactive, vous pouvez utiliser le "registre de ligne de commande". Autrement dit, appuyez sur
:+1del 3<CR>
puis1000@:
la source
une alternative: vous souhaitez conserver toutes les lignes: 1, 4, etc. Vous pouvez utiliser:
une autre alternative: si vous connaissez les lignes que vous souhaitez faire correspondre à un motif unique:
la source