¿Puedo hacer que: s opere solo en el último partido de la línea?


16

:s/pattern/replacementopera en el primer partido y :s/pattern/replacement/gen todos.

¿Cómo operar solo en el último?

Respuestas:


18

yo usaría \zs

:%s/.*\zspattern/replacement/

Un poco de explicación:

  • . representa cualquier personaje individual
  • * representa la correspondencia codiciosa (tantas como sea posible)

En Vim puede usar anclas de ancho cero \zsy \zedefinir el inicio y el final del patrón buscado, que desea hacer coincidir. Cualquier cosa antes \zsy después \zeen su patrón no se verá afectada por el reemplazo.

Para que sea más fácil de entender, me gustaría utilizar este ejemplo de Wikia 's Buscar y reemplazar :

Ahorre escribiendo usando \zsy \zepara establecer el inicio y el final de un patrón. Por ejemplo, en lugar de:

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

Utilizar:

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

Para más información, mira


¿Puede proporcionar una descripción básica de lo que \zshace en su respuesta?
EvergreenTree

3
Vale la pena señalar que la razón por la que esto funciona es porque .*es codicioso .
Comodín el

7

Puede buscar la última coincidencia agrupando todos \(.*\), pero la última aparición de pattern. Luego, salir con el grupo capturado \1, y agregar el replacement.

:%s/\(.*\)pattern/\1replacement/

(Esto es inferior a la \zssolución de @ ryuichiro , ya que su \1enfoque es funcionalmente equivalente, pero más detallado. (Por otro lado, puede ser más fácil de recordar para algunos, particularmente si están acostumbrados a otros sabores de expresiones regulares).)
Aaron Thoma

0

En aras de la exhaustividad, pensé en publicar una alternativa. Vim tiene varios elementos, algunos de los cuales son similares a las aserciones de búsqueda de expresiones regulares más estándar (búsqueda anticipada / negativa negativa / positiva). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups

En este caso, queremos una anticipación negativa \@!, lo que significa que queremos afirmar que el átomo que precede al elemento no ocurre después del patrón . En este caso, el átomo es el patrón en sí mismo precedido por cualquier otra cosa:

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

La parte dentro de los paréntesis es de ancho cero y no se incluye en la coincidencia, por lo que no se reemplaza por la sustitución.

:h \@!para obtener más información o :h pattern-multi-itemspara toda la sección que contiene otras variaciones de búsqueda.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.