VIM substitui ocorrências de padrão após uma palavra específica em uma linha

7

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?

    
por user13107 19.09.2013 / 20:17

2 respostas

3

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
    
por 19.09.2013 / 22:47
4

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

por 19.09.2013 / 20:26