Je veux faire ça:
%s/shop_(*)/shop_\1 wp_\1/
Pourquoi shop_(*)
ne correspond-il à rien?
Si je comprends bien, vous voulez %s/shop_\(.*\)/shop_\1 wp_\1/
Échappez à la parenthèse de capture et utilisez .*
pour correspondre à n'importe quel nombre de n'importe quel caractère.
(Votre recherche recherche "shop_" suivi d'un nombre quelconque de parenthèses ouvrantes suivi d'une parenthèse fermante)
Il y a plusieurs problèmes ici.
les parens dans vim regexen ne sont pas destinés à la capture - vous devez utiliser \( \)
pour les captures.
*
Ne signifie pas ce que vous pensez. Cela signifie "0 ou plus de la précédente", donc votre expression régulière signifie "une chaîne qui contient shop_
Suivi de 0+ (
Et ensuite d'un littéral )
.
Vous recherchez .
, Qui en regex signifie "n'importe quel caractère". Mis avec une étoile comme .*
Cela signifie "0 ou plus de n'importe quel caractère". Vous voulez probablement au moins un caractère, utilisez donc .\+
(+
Signifie "1 ou plus du précédent")
Utilisez ceci: %s/shop_\(.\+\)/shop_\1 wp_\1/
.
Vous pouvez éventuellement le terminer par g
après la barre oblique finale pour remplacer toutes les instances sur une seule ligne plutôt que la première.