¿Hay un equivalente para vim's \ zs en sed o perl?


11

En vim podemos usar el \zsátomo para decir "realmente comienza el partido aquí":

:%s/funnyword\zs.*$/otherword/

¿Hay un equivalente para sed o incluso perl?

Respuestas:


15

En Perl (y PCRE) esto se puede lograr con una mirada atrás de ancho cero :

(?<=funnyword).*$

que coincide con "palabra divertida", pero no la consume como parte de la coincidencia. Estos solo funcionan con texto de longitud fija en retrospectiva. También puede usar lookbehinds negativos ( (?<!...)) para especificar que parte del texto no está allí.

En cualquier versión razonablemente reciente de Perl, \Kes casi un sustituto exacto de\zs como lo está usando:

funnyword\K.*$

\Kdescarta todo lo que coincide hasta ahora, pero continúa coincidiendo desde ese punto en adelante. La parte anterior \Kno tiene que ser de longitud fija. Esto también está en PCRE ahora , pero no estoy seguro de qué versión vino.

\zese puede lograr con una búsqueda anticipada de ancho cero en su lugar, usando (?=...). Ese patrón no necesita ser de longitud fija.


Debido a que sed usa POSIX BRE , no hay búsqueda . Sin embargo, en este caso, puede simularlo con bastante facilidad utilizando un grupo de captura ordinario:

sed -e 's/\(funnyword\).*$/\1otherword/'

Puede hacer lo mismo para mirar hacia adelante positivo. Si realmente tiene un requisito más complicado, es posible que tenga que recurrir a Perl o algún otro enfoque.

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.