Apakah ada yang setara dengan vim's di sed atau perl?

11

Dalam vim kita dapat menggunakan \zsatom untuk mengatakan "benar-benar memulai pertandingan di sini":

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

Apakah ada yang setara untuk sed atau bahkan perl?

ninrod
sumber

Jawaban:

15

Di Perl (dan PCRE) ini dapat dicapai dengan tampilan lebar nol di belakang :

(?<=funnyword).*$

yang cocok dengan "funnyword", tetapi tidak mengkonsumsinya sebagai bagian dari pertandingan. Ini hanya bekerja dengan teks panjang tetap di tampilan di belakang. Anda juga dapat menggunakan tampilan negatif ( (?<!...)) untuk menentukan bahwa beberapa teks tidak ada.

Dalam setiap versi Perl yang cukup baru, \Khampir merupakan pengganti tepat\zs saat Anda menggunakannya:

funnyword\K.*$

\Kmembuang semua yang cocok sejauh ini tetapi terus mencocokkan dari titik itu dan seterusnya. Bagian sebelumnya \Ktidak harus panjang tetap. Ini juga ada di PCRE sekarang , tapi saya tidak yakin versi apa yang masuk.

\zedapat dicapai dengan lookahead lebar nol sebagai gantinya, menggunakan (?=...). Pola itu tidak perlu diperbaiki.


Karena sed menggunakan BRE POSIX , tidak ada lookaround . Namun, dalam kasus ini, Anda dapat dengan mudah mensimulasikannya menggunakan grup tangkapan biasa:

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

Anda dapat melakukan hal yang sama untuk tampilan positif. Jika Anda benar-benar memiliki persyaratan yang lebih rumit, Anda mungkin harus melihat Perl atau pendekatan lain.

Michael Homer
sumber