Sed veya perl'de vim \ zs eşdeğeri var mı?


11

Vim'de \zsatomu "gerçekten burada maça başlayın" demek için kullanabiliriz :

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

Sed ve hatta perl için bir eşdeğeri var mı?

Yanıtlar:


15

Perl (ve PCRE) 'de bu, sıfır genişlikli bir gözbebek ile elde edilebilir :

(?<=funnyword).*$

"funnyword" ile eşleşiyor, ancak maçın bir parçası olarak tüketmiyor. Bunlar yalnızca görünüm arkasındaki sabit uzunlukta metinlerle çalışır. (?<!...)Bazı metinlerin orada olmadığını belirtmek için negatif lookbehinds ( ) yöntemini de kullanabilirsiniz .

Perl'in herhangi bir makul versiyonunda, kullandığınız \Kiçin neredeyse tam bir alternatiftir\zs :

funnyword\K.*$

\Kşu ana kadar eşleşen her şeyi atar ancak bu noktadan itibaren eşleşmeye devam eder. Önceki bölümün \Ksabit uzunlukta olması gerekmez. Bu da şimdi PCRE'de , ancak hangi sürümde geldiğinden emin değilim.

\zekullanarak, sıfır genişlikli bir önden okuma ile elde edilebilir (?=...). Bu desen değil , sabit uzunlukta olması gerekir.


Sed kullanımları nedeniyle Bres POSIX , hiçbir etrafa bakma yoktur . Bu durumda, sıradan bir yakalama grubu kullanarak oldukça kolay bir şekilde simüle edebilirsiniz:

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

Pozitif ileri gitmek için de aynısını yapabilirsiniz. Gerçekten daha karmaşık bir gereksiniminiz varsa, Perl veya başka bir yaklaşıma bakmanız gerekebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.