Czy istnieje odpowiednik vim's zs w sed lub perl?

11

W vimie możemy użyć \zsatomu, aby powiedzieć „naprawdę rozpocznij mecz właśnie tutaj”:

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

Czy istnieje odpowiednik sed, a nawet perla?

ninrod
źródło

Odpowiedzi:

15

W Perlu (i PCRE) można to osiągnąć za pomocą wyglądu zerowej szerokości :

(?<=funnyword).*$

który pasuje do „zabawnego słowa”, ale nie zużywa go jako części dopasowania. Działają one tylko z tekstem o stałej długości w lookbehind. Możesz także użyć ujemnego lookbehinds ( (?<!...)), aby określić, że nie ma tam jakiegoś tekstu.

W każdej dość aktualnej wersji Perla \Kjest prawie dokładnym zamiennikiem\zs , gdy go używasz:

funnyword\K.*$

\Kodrzuca wszystko, co do tej pory pasowało, ale kontynuuje dopasowanie od tego momentu. Poprzednia część \Knie musi mieć stałej długości. Jest to teraz także w PCRE , ale nie jestem pewien, w jakiej wersji się pojawił.

\zemożna osiągnąć za pomocą funkcji lookahead o zerowej szerokości, używając (?=...). Ten wzór nie musi mieć stałej długości.


Ponieważ sed używa BREIX POSIX , nie ma na to spojrzenia . W tym przypadku można jednak dość łatwo przeprowadzić symulację za pomocą zwykłej grupy przechwytywania:

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

Możesz zrobić to samo dla pozytywnego spojrzenia w przyszłość. Jeśli naprawdę masz bardziej skomplikowane wymagania, być może będziesz musiał spojrzeć na Perla lub inne podejście.

Michael Homer
źródło