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?
fuente
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?
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, \K
es casi un sustituto exacto de\zs
como lo está usando:
funnyword\K.*$
\K
descarta todo lo que coincide hasta ahora, pero continúa coincidiendo desde ese punto en adelante. La parte anterior \K
no tiene que ser de longitud fija. Esto también está en PCRE ahora , pero no estoy seguro de qué versión vino.
\ze
se 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.