Esiste un equivalente per vim's \ zs in sed o perl?


11

In vim possiamo usare l' \zsatomo per dire "inizia davvero la partita proprio qui":

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

Esiste un equivalente per sed o addirittura perl?

Risposte:


15

In Perl (e PCRE) questo è possibile con un lookbehind di larghezza zero :

(?<=funnyword).*$

che corrisponde a "parola divertente", ma non lo consuma come parte della partita. Funzionano solo con testo a lunghezza fissa nel lookbehind. Puoi anche usare lookbehinds negativi ( (?<!...)) per specificare che parte del testo non c'è.

In qualsiasi versione abbastanza recente di Perl, \Kè quasi un sostituto esatto per\zs come lo stai usando:

funnyword\K.*$

\Kscarta tutto ciò che corrisponde finora, ma continua a corrispondere da quel punto in poi. La parte prima \Knon deve essere di lunghezza fissa. Anche questo è in PCRE ora , ma non sono sicuro di quale versione sia arrivata.

\zepuò essere invece ottenuto con un lookahead a larghezza zero, usando (?=...). Quel modello non ha bisogno di essere a lunghezza fissa.


Poiché sed utilizza POSIX BREs , non esiste alcuna soluzione . In questo caso, tuttavia, puoi simularlo abbastanza facilmente usando un normale gruppo di acquisizione:

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

Puoi fare lo stesso per lookahead positivo. Se hai davvero un requisito più complicato, potresti dover guardare a Perl o qualche altro approccio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.