Existe um equivalente para \ zs do vim em sed ou perl?

11

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?

ninrod
fonte

Respostas:

15

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.*$

\Kdescarta tudo o que correspondeu até agora, mas continua a corresponder a partir desse ponto. A peça anterior \Knão precisa ser de comprimento fixo. Isso também está no PCRE agora , mas não tenho certeza de qual versão ele veio.

\zepode 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.

Michael Homer
fonte