Dalam vim kita dapat menggunakan \zs
atom untuk mengatakan "benar-benar memulai pertandingan di sini":
:%s/funnyword\zs.*$/otherword/
Apakah ada yang setara untuk sed atau bahkan perl?
sumber
Dalam vim kita dapat menggunakan \zs
atom untuk mengatakan "benar-benar memulai pertandingan di sini":
:%s/funnyword\zs.*$/otherword/
Apakah ada yang setara untuk sed atau bahkan perl?
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, \K
hampir merupakan pengganti tepat\zs
saat Anda menggunakannya:
funnyword\K.*$
\K
membuang semua yang cocok sejauh ini tetapi terus mencocokkan dari titik itu dan seterusnya. Bagian sebelumnya \K
tidak harus panjang tetap. Ini juga ada di PCRE sekarang , tapi saya tidak yakin versi apa yang masuk.
\ze
dapat 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.