No vim, podemos usar o \zs
átomo para dizer "realmente comece a partida aqui":
:%s/funnyword\zs.*$/otherword/
Existe um equivalente para sed ou mesmo perl?
fonte
No vim, podemos usar o \zs
átomo para dizer "realmente comece a partida aqui":
:%s/funnyword\zs.*$/otherword/
Existe um equivalente para sed ou mesmo perl?
No Perl (e PCRE), isso é possível com uma aparência de largura zero :
(?<=funnyword).*$
que corresponde a "palavrão", mas não o consome como parte da correspondência. Eles funcionam apenas com texto de comprimento fixo na parte de trás. Você também pode usar lookbehinds negativos ( (?<!...)
) para especificar que algum texto não existe.
Em qualquer versão razoavelmente recente do Perl, \K
é quase um substituto exato para\zs
o uso:
funnyword\K.*$
\K
descarta tudo o que correspondeu até agora, mas continua a corresponder a partir desse ponto. A peça anterior \K
não precisa ser de comprimento fixo. Isso também está no PCRE agora , mas não tenho certeza de qual versão ele veio.
\ze
pode ser alcançado com um cabeçote de largura zero, usando (?=...)
. Esse padrão não precisa ter um comprimento fixo.
Como o sed usa POSIX BREs , não há busca . Nesse caso, porém, você pode simulá-lo facilmente usando um grupo de captura comum:
sed -e 's/\(funnyword\).*$/\1otherword/'
Você pode fazer o mesmo com uma aparência positiva. Se você realmente tem um requisito mais complicado, pode ser necessário procurar no Perl ou em alguma outra abordagem.