Você pode usar o átomo especial \@<=
para declarar uma correspondência antes ( =.*
para torná-lo em qualquer lugar antes nessa linha):
:%s/\(=.*\)\@<=pattern/saturn/g
Eu tenho essas linhas no meu texto.
text before pattern = garbage** text after pattern is pattern
Se no VIM eu faço %s/pattern/saturn/
ele substitui todas as ocorrências de pattern
. Mas eu só quero substituir as ocorrências que vêm depois de =
. Deve ignorar tudo na linha que ocorre antes de =
. Como fazer isso?
Supondo que você tenha apenas uma ocorrência de pattern
antes de =
, é possível fazer isso em duas etapas:
:%s/pattern/saturn/g
:%s/saturn\(.\{-}=\)/pattern/
O \{-}
instrui .
para corresponder preguiçosamente (também não avidamente).
Explicação
Esta primeira etapa substitui todas as ocorrências de pattern
por saturn
na próxima etapa, em seguida, procura a palavra saturn
antes de =
e a substitui por pattern
.
Cuidado
Isso pressupõe uma única ocorrência de =
em cada linha.
Uma maneira melhor (apenas assume um único =
por linha)
Você pode fazer isso com uma macro recursiva:
qaqqa:%s/\(=.\{-}\)pattern/saturn/@aq@a
Isso substitui uma única ocorrência de pattern
após =
com saturn
. Quando armazenado como uma macro e chamado recursivamente, continuará trabalhando no arquivo até que não haja mais nada para substituir. É hackea mas funciona.
Veja também
Tags vim vi regular-expression