web-dev-qa-db-fra.com

Est-il possible d'utiliser la recherche et le remplacement sur une chaîne générique dans VIM?

Par exemple, j'ai un tas de valeurs avec un préfixe et un suffixe communs, tels que:

fooVal1Bar;

fooVal2Bar;

fooVal3Bar;

Dans ce cas, tous les noms de variables commencent et se terminent par foo et se terminent par Bar. Je veux utiliser une recherche et remplacer en utilisant les noms de variables aléatoires trouvés entre foo et Bar. Disons que j'ai déjà des variables Val1, Val2, Val3, et Val1Old, Val2Old, et Val3Old Défini. Je ferais une recherche de remplacement, quelque chose comme:

:%s/foo<AnyString>Bar/foo<AnyString>Bar = <AnyString> + <AnyString>Old

Il en résulterait:

fooVal1Bar = Val1 + Val1Old;

fooVal2Bar = Val2 + Val2Old;

fooVal3Bar = Val3 + Val3Old;

J'espère que ce que je veux faire est clair, je n'ai rien trouvé dans l'aide de vim ou en ligne sur le remplacement par des chaînes génériques. Le maximum que j'ai pu trouver concernait la recherche de chaînes génériques.

36
dwcanillas

Je crois que tu veux

:%s/foo\(\w\+\)Bar/& = \1 + \1\Old/

explication:

\w\+ Trouve une ou plusieurs occurrences d'un personnage. Les précurseurs foo et suivants Bar garantissent que ces caractères correspondants sont juste entre un foo et un Bar.

\(...\) stocke ces caractères afin qu'ils puissent être utilisés dans la partie remplacer de la substitution.

& Copie ce qui a été trouvé

\1 Est la chaîne capturée dans la partie \(....\).

54
René Nyffenegger

Vous devez capturer ce que vous souhaitez enregistrer. Essayez quelque chose comme ceci:

%s/\(foo\(\w\+\)Bar\);/\1 = \2 \2Old/

Ou vous pouvez le nettoyer un peu avec magie :

%s/\v(foo(\w+)Bar);/\1 = \2 \2Old/
4
gpojd