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