Respostas:
eu usaria \zs
:%s/.*\zspattern/replacement/
Um pouco de explicação:
. representa qualquer caractere único* representa correspondência gananciosa (o maior número possível)No Vim, você pode usar âncoras de largura zero \zse \zedefinir o início e o fim do padrão pesquisado, com o qual deseja corresponder. Qualquer coisa antes \zse depois \zedo seu padrão não será afetada pela substituição.
Para torná-lo fácil de entender, eu gostaria de usar este exemplo da Wikia 's Pesquisa e substituir :
Salve a digitação usando
\zse\zepara definir o início e o fim de um padrão. Por exemplo, em vez de::s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/Usar:
:s/Copyright \zs2007\ze All Rights Reserved/2008/
Para mais informações, consulte
.*é ganancioso .
Você pode procurar a última correspondência agrupando tudo \(.*\), mas a última ocorrência de pattern. Em seguida, sair com o grupo capturado \1e adicionar o replacement.
:%s/\(.*\)pattern/\1replacement/
\zssolução de @ ryuichiro , em que sua \1abordagem é funcionalmente equivalente, mas mais detalhada. (Por outro lado, pode ser mais fácil lembrar de alguns, principalmente se eles estiverem acostumados a outros tipos de expressões regulares))
Por uma questão de integridade, pensei em publicar uma alternativa. O Vim possui vários itens, alguns dos quais são semelhantes às asserções de busca padrão de expressões regulares mais comuns ( procura negativa / positiva / procura por trás). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups
Nesse caso, queremos um lookahead negativo \@!, o que significa que queremos afirmar que o átomo que precede o item não ocorre após o padrão . Nesse caso, o átomo é o próprio padrão precedido por qualquer outra coisa:
:%s/pattern\(.*pattern\)\@!/replacement/
A parte entre parênteses é de largura zero e não está incluída na partida, portanto não é substituída pela substituição.
:h \@!para obter mais informações ou :h pattern-multi-itemspara toda a seção que contém outras variações de aparência.
\zsfaz em sua resposta?