In vim können wir das \zs
Atom verwenden, um zu sagen "Beginnen Sie das Match wirklich hier":
:%s/funnyword\zs.*$/otherword/
Gibt es ein Äquivalent für sed oder sogar perl?
quelle
In vim können wir das \zs
Atom verwenden, um zu sagen "Beginnen Sie das Match wirklich hier":
:%s/funnyword\zs.*$/otherword/
Gibt es ein Äquivalent für sed oder sogar perl?
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 \K
ist dies fast ein exakter Ersatz für\zs
die Verwendung von Perl :
funnyword\K.*$
\K
verwirft alles, was bisher übereinstimmt, stimmt aber ab diesem Zeitpunkt weiter überein. Das vorherige Teil \K
muss nicht fest sein. Dies ist jetzt auch in PCRE , aber ich bin nicht sicher, in welcher Version es kam.
\ze
kann 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.