Bisakah saya membuat: beroperasi hanya pada pertandingan terakhir baris?


16

:s/pattern/replacementberoperasi pada pertandingan pertama dan :s/pattern/replacement/gsemua.

Bagaimana cara beroperasi hanya pada yang terakhir?

Jawaban:


18

Saya akan menggunakan \zs

:%s/.*\zspattern/replacement/

Sedikit penjelasan:

  • . mewakili setiap karakter tunggal
  • * mewakili pencocokan serakah (sebanyak mungkin)

Di Vim Anda dapat menggunakan jangkar lebar nol \zsdan \zeuntuk menentukan awal dan akhir dari pola yang dicari, yang ingin Anda cocokkan. Apa pun sebelum \zsdan sesudah \zedalam pola Anda akan tetap tidak terpengaruh oleh penggantian.

Untuk membuatnya mudah dimengerti, saya ingin menggunakan contoh ini dari Wikia 's Pencarian dan mengganti :

Simpan pengetikan dengan menggunakan \zsdan \zeuntuk mengatur awal dan akhir suatu pola. Misalnya, alih-alih:

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/ 

Menggunakan:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

Untuk informasi lebih lanjut, lihat


Bisakah Anda memberikan uraian dasar tentang apa yang \zsada dalam jawaban Anda?
EvergreenTree

3
Itu perlu dicatat bahwa alasan ini bekerja adalah karena .*adalah serakah .
Wildcard

7

Anda dapat mencari kecocokan terakhir dengan mengelompokkan semua \(.*\),, tetapi kejadian terakhir dari pattern. Kemudian keluar dengan grup yang ditangkap \1,, dan menambahkan replacement.

:%s/\(.*\)pattern/\1replacement/

(Ini lebih rendah daripada \zssolusi @ ryuichiro , dalam hal \1pendekatan Anda secara fungsional setara, tetapi lebih bertele-tele. (Di sisi lain, mungkin lebih mudah diingat untuk beberapa, terutama jika mereka digunakan untuk rasa regex lainnya.))
Aaron Thoma

0

Demi kelengkapan saya pikir saya akan memposting alternatif. Vim memiliki multi-item beberapa di antaranya mirip dengan pernyataan pencarian ekspresi reguler yang lebih standar (lookahead negatif / positif / lihat di belakang). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups

Dalam hal ini kami menginginkan tampilan negatif \@!,, yang berarti kami ingin menegaskan bahwa atom yang mendahului item tidak terjadi setelah pola . Dalam hal ini atom adalah pola itu sendiri yang didahului oleh hal lain:

:%s/pattern\(.*pattern\)\@!/replacement/

Bagian di dalam tanda kurung adalah nol-lebar dan tidak termasuk dalam pertandingan sehingga tidak digantikan oleh substitusi.

:h \@!untuk informasi lebih lanjut atau :h pattern-multi-itemsuntuk seluruh bagian yang mengandung variasi lookaround lainnya.

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.