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?

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.