Ganti menggunakan VIM, gunakan kembali bagian dari pola pencarian

29

Saya bekerja dengan VImdan mencoba mengatur pencarian dan mengganti perintah untuk melakukan beberapa penggantian di mana saya dapat menggunakan kembali ekspresi reguler yang merupakan bagian dari string pencarian saya.

Contoh sederhana akan menjadi garis di mana saya ingin mengganti (10)ke {10}, di mana 10 dapat menjadi nomor apapun.

Saya datang sejauh ini

  .s/([0-9]*)/what here??/

yang cocok persis dengan bagian yang saya inginkan.

Sekarang penggantinya, saya mencoba

  .s/([0-9]*)/{\0}/

Tapi, ini memberi sebagai output {(10)}

Kemudian, saya mencoba

 .s/(\zs[0-9]*\ze)/{\0}/

Namun, itu memberi saya ({10}), yang saya juga tutup, tetapi tidak apa yang saya inginkan.

Saya pikir saya perlu jenis lain dari penandaan / referensi-kembali daripada ini \0, tapi saya tidak tahu harus mencarinya ke mana. Jadi pertanyaannya adalah, dapatkah ini dilakukan dalam vim, dan jika demikian, bagaimana?

Bernhard
sumber

Jawaban:

37

\0adalah seluruh pertandingan. Untuk hanya menggunakan sebagian saja, Anda perlu mengaturnya seperti ini dan menggunakan \ 1

.s/(\([0-9]*\))/{\1}/

Instruksi lebih rinci dapat Anda temukan di sini atau dalam bantuan vim.

buru-buru
sumber
Perhatikan tanda kurung untuk menangkap mundur garis miring terbalik.
Randall
0

Saya baru-baru ini mewarisi beberapa kode lama dan saya ingin mengganti semua kejadian seperti:

print "xx"
print x,y
print 'xx'

untuk

logging.info("xy") 

atau

logging.info(x,y)

Membangun jawaban sebelumnya dan dengan harapan bahwa seseorang akan mendapat manfaat dari itu saya menggunakan perintah berikut, yang akan mengubah semua kejadian:

%s/print\( .*\)/logging.info\(\1\)/g

Jika Anda mengganti %dengan .dan menghapus /gAnda akan berakhir dengan

.s/print\( .*\)/logging.info\(\1\)

yang akan memungkinkan Anda untuk pergi ke setiap pertandingan dan memilih apakah Anda mengubahnya atau tidak.

yagad
sumber
0

Cara yang lebih baik untuk memungkinkan Anda memeriksa setiap pertandingan adalah dengan menambahkan "c" di bagian akhir kode, daripada pergi baris demi baris

%s/print\( .*\)/logging.info\(\1\)/gc
Tim Rosenow
sumber
Ini benar-benar tidak menjawab pertanyaan asli dengan cara apa pun
Bernhard