Desde que você marcou isso com vi e originalmente perguntado sobre vi, eu explicarei porque não funcionou no vi para você e como consertá-lo. Você disse que tentou originalmente:
%s/ab*/ab001/g
A maneira como o *
funciona nas pesquisas é comparando o átomo anterior 0 ou mais vezes, o maior número possível. De :h /*
:
*/star* */\star*
* (use \* when 'magic' is not set)
Matches 0 or more of the preceding atom, as many as possible.
Nesse caso, o átomo anterior é 'b', portanto, essa pesquisa corresponderá a qualquer um deles:
a
ab
abbb
abbbbbbbbbbbbbbbbbbb
Ele também corresponderá a ab001
, mas corresponderá apenas à primeira parte, portanto, a correspondência será (ab)001
. Vi vê que você estava procurando por isso e o substitui por (ab001)001
. A solução é simples. Você quer combinar
'ab' followed by anything
O caractere de ponto ( .
) corresponderá a qualquer caractere, exceto por uma nova linha. Então, se você procurar por
/ab.*/
corresponderá a qualquer coisa que comece com 'ab'. Então você quer:
:%s/ab.*/ab001/g
Se isso corresponder muito (por exemplo, palavras como 'absolutamente'), você poderá simplificar isso para procurar apenas dígitos. Por exemplo, isso corresponderá a 'ab' seguido por qualquer número de dígitos:
/ab\d*/
e isso corresponderá a 'ab' seguido por exatamente três dígitos:
/ab\d\{3}/
Eu recomendaria marcar esta página para uma referência rápida do vi-regex. Descobri que é extremamente valioso para solucionar problemas de certas expressões regulares.