Gibt es ein Äquivalent für vims \ zs in sed oder perl?

11

In vim können wir das \zsAtom verwenden, um zu sagen "Beginnen Sie das Match wirklich hier":

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

Gibt es ein Äquivalent für sed oder sogar perl?

Ninrod
quelle

Antworten:

15

In Perl (und PCRE) ist dies mit einem Lookbehind mit einer Breite von Null erreichbar :

(?<=funnyword).*$

das mit "lustiges Wort" übereinstimmt, es aber nicht als Teil des Spiels verbraucht. Diese funktionieren nur mit Text fester Länge im Lookbehind. Sie können auch negative lookbehinds ( (?<!...)) verwenden, um anzugeben, dass Text nicht vorhanden ist.

In jeder einigermaßen aktuellen Version von Perl \Kist dies fast ein exakter Ersatz für\zs die Verwendung von Perl :

funnyword\K.*$

\Kverwirft alles, was bisher übereinstimmt, stimmt aber ab diesem Zeitpunkt weiter überein. Das vorherige Teil \Kmuss nicht fest sein. Dies ist jetzt auch in PCRE , aber ich bin nicht sicher, in welcher Version es kam.

\zekann stattdessen mit einem Lookahead mit einer Breite von Null erreicht werden (?=...). Dieses Muster muss nicht fest sein.


Da sed POSIX BREs verwendet , gibt es keinen Lookaround . In diesem Fall können Sie es jedoch ziemlich einfach mit einer normalen Erfassungsgruppe simulieren:

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

Sie können das gleiche für positive Lookahead tun. Wenn Sie wirklich eine kompliziertere Anforderung haben, müssen Sie sich möglicherweise an Perl oder einen anderen Ansatz wenden.

Michael Homer
quelle