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?

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.