Posso fazer: s operar apenas na última partida da linha?

16

:s/pattern/replacementopera no primeiro jogo e :s/pattern/replacement/gem todos.

Como operar apenas no último?

Toothrot
fonte

Respostas:

18

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

Ryuichiro
fonte
Você pode fornecer uma descrição básica do que \zsfaz em sua resposta?
EvergreenTree
3
Vale a pena notar que a razão pela qual isso funciona é porque .*é ganancioso .
Curinga
7

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/
bolichep
fonte
(Isso é inferior à \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))
Aaron Thoma
0

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.

Camada B
fonte