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

10

No vim, podemos usar o \zs atom para dizer "realmente começar a partida aqui mesmo":

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

Existe um equivalente para sed ou mesmo perl?

    
por ninrod 29.12.2016 / 01:58

1 resposta

13

Em Perl (e PCRE) isso é possível com um lookbehind de largura zero :

(?<=funnyword).*$

que corresponde a "funnyword", mas não o consome como parte do jogo. Estes só funcionam com texto de comprimento fixo no lookbehind. Você também pode usar lookbehinds negativos ( (?<!...) ) para especificar que algum texto não está lá.

Em qualquer versão razoavelmente recente do Perl, \K é quase um substituto exato para \zs conforme você está usando:

funnyword\K.*$

\K descarta tudo que foi correspondido até o momento, mas continua correspondendo a partir desse ponto. A parte antes de \K não precisa ser de comprimento fixo. Isso é também no PCRE agora , mas não tenho certeza de qual versão ele veio .

\ze pode ser obtido com uma lookahead de largura zero, usando (?=...) . Esse padrão não precisa ser de tamanho fixo.

Como o sed usa BREs POSIX , não há nenhuma referência . Neste caso, você pode facilmente simular usando um grupo de captura comum:

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

Você pode fazer o mesmo para uma visão positiva. Se você realmente tem um requisito mais complicado, talvez tenha que procurar Perl ou alguma outra abordagem.

    
por 29.12.2016 / 02:18