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?

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.