Après un peu plus de fouilles, il s'avère que vim peut le faire avec une seule commande, sans script. Par exemple, pour ajouter 50 à tous les nombres suivants, <obj param="
vous pouvez utiliser:
:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g
Permettez-moi de décomposer cela.
:
est le moyen général pour entrer / signifier le mode ligne de commande dans vim.
%
les moyens entrant dans le cadre de l'ensemble du document; vous pouvez mettre une plage de nombres, par exemple, 1,50
pour le faire à la place dans les 50 premières lignes.
s
est un raccourci pour remplacer (vous pouvez écrire le mot entier si vous préférez)
@
est le délimiteur; vous pouvez utiliser n'importe quel autre caractère tant qu'il n'est pas dans ce que vous recherchez. Il suffit de l'utiliser trois fois. (La syntaxe est similaire à sed
.)
Jusqu'à la prochaine occurrence du délimiteur @, tout est le modèle reg ex à rechercher, dans ce cas <obj param="
suivi par \d\+
, qui est un nombre quelconque de chiffres. Le \(
et \)
sont là pour définir cette séquence entière de chiffres comme un seul groupe reg ex qui correspondrait à des références arrière comme \1
, ou à la submatch
commande de vim .
Le délimiteur @
marque ensuite ce qui suit comme texte de remplacement.
Au \=
début, ici signifie remplacer le résultat d'une expression évaluée, plutôt qu'un modèle ou une chaîne reg ex, qui est la clé ici.
Ensuite, nous avons '<obj param="'
pour le début du texte de remplacement. Ce .
qui suit est la fonction de vim pour concaténer les chaînes.
submatch(1)
est une fonction intégrée de vim qui ne peut être utilisée que dans une commande de substitution, et renvoie la chaîne qui est la même que l'expression régulière \1
; vous utiliseriez submatch(2)
pour l'équivalent de regex \2
et ainsi de suite. ( \0
est l'ensemble du modèle correspondant, mais nous ne le voulons pas ici.) Le \(
et \)
dans le modèle de recherche sont utilisés pour marquer ce qui compte submatch(1)
.
Par conséquent (submatch(1) + 50)
donne le résultat de l' addition de 50 au nombre que les chiffres ci - dessous <obj param="
sous forme de modèle de recherche.
Le délimiteur @
est à nouveau utilisé pour marquer la fin du texte de remplacement.
Le drapeau g
est utilisé pour rendre les substitutions globales; vous pouvez omettre cela si vous souhaitez uniquement remplacer la première instance sur chaque ligne.
Vous pouvez probablement déterminer à partir de là comment ajouter des nombres différents, ou soustraire, ou diviser, etc.
vim
etemacs
je peux faire ce genre de chose, mais cela pourrait nécessiter l'écriture d'un script plutôt que l'utilisation d'une seule commande.