Puis-je faire: s opérer uniquement sur le dernier match de la ligne?

16

:s/pattern/replacementfonctionne sur le premier match et :s/pattern/replacement/gsur tous.

Comment opérer uniquement sur le dernier?

Toothrot
la source

Réponses:

18

j'utiliserais \zs

:%s/.*\zspattern/replacement/

Un peu d'explication:

  • . représente n'importe quel caractère
  • * représente l'appariement gourmand (autant que possible)

Dans Vim, vous pouvez utiliser des ancres de largeur nulle \zset \zepour définir le début et la fin du motif recherché, que vous souhaitez faire correspondre. Tout ce qui se trouve avant \zset après \zedans votre modèle ne sera pas affecté par le remplacement.

Pour le rendre facile à comprendre, je voudrais utiliser cet exemple de la recherche et du remplacement de wikia :

Enregistrez la saisie en utilisant \zset \zepour définir le début et la fin d'un motif. Par exemple, au lieu de:

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/ 

Utilisation:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

Pour plus d'informations, consultez

ryuichiro
la source
Pouvez-vous fournir une description de base de ce que \zscontient votre réponse?
EvergreenTree du
3
Il convient de noter que la raison pour laquelle cela fonctionne est parce qu'il .*est gourmand .
Wildcard
7

Vous pouvez rechercher la dernière correspondance en regroupant tout \(.*\), mais la dernière occurrence de pattern. Quitter ensuite avec le groupe capturé \1et ajouter le replacement.

:%s/\(.*\)pattern/\1replacement/
bolichep
la source
(Ceci est inférieur à la \zssolution de @ ryuichiro , dans la mesure où votre \1approche est fonctionnellement équivalente, mais plus verbeuse. (D'un autre côté, il peut être plus facile de s'en souvenir pour certains, en particulier s'ils sont habitués à d'autres saveurs d'expression régulière.))
Aaron Thoma
0

Par souci d'exhaustivité, j'ai pensé publier une alternative. Vim a plusieurs éléments dont certains sont similaires aux assertions de recherche d' expression régulière plus standard (lookahead / lookbehind négatif / positif). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups

Dans ce cas, nous voulons une anticipation négative \@!, ce qui signifie que nous voulons affirmer que l' atome qui précède l'élément ne se produit pas après le motif . Dans ce cas, l'atome est le motif lui-même précédé de toute autre chose:

:%s/pattern\(.*pattern\)\@!/replacement/

La partie entre parenthèses est de largeur nulle et n'est pas incluse dans la correspondance, elle n'est donc pas remplacée par la substitution.

:h \@!pour plus d'informations ou :h pattern-multi-itemspour la section entière contenant d'autres variantes de lookaround.

Couche B
la source