Setelah sedikit lebih bolak-balik, ternyata vim bisa melakukannya dengan satu perintah, tanpa scripting. Misalnya, untuk menambahkan 50 ke semua angka berikut <obj param="
Anda dapat menggunakan:
:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g
Biarkan saya memecahnya.
:
adalah cara umum untuk masuk / menandakan mode baris perintah di vim.
%
berarti dalam lingkup seluruh dokumen; Anda bisa memasukkan rentang angka, misalnya, 1,50
hanya melakukannya dalam 50 baris pertama saja.
s
adalah singkatan untuk pengganti (Anda dapat menulis seluruh kata jika Anda suka)
@
adalah pembatas; Anda dapat menggunakan karakter lain selama tidak dalam apa yang Anda cari. Cukup gunakan tiga kali. (Sintaksnya mirip dengan sed
.)
Semuanya hingga kemunculan pembatas @ berikutnya adalah pola reg ex untuk dicari, dalam hal ini <obj param="
diikuti oleh \d\+
, yang merupakan angka berapa pun. The \(
dan \)
ada di sana untuk mengatur seluruh urutan digit ini sebagai grup reg ex tunggal yang akan cocok dengan referensi seperti \1
, atau submatch
perintah vim .
Kemudian pembatas @
menandai bahwa apa yang mengikuti sebagai teks pengganti.
Di \=
bagian awal di sini berarti menggantikan hasil dari beberapa ekspresi yang dievaluasi, bukan pola atau string reg ex, yang merupakan kunci di sini.
Kemudian kita miliki '<obj param="'
untuk memulai teks pengganti. The .
yang mengikuti adalah fungsi vim untuk concatenating string.
submatch(1)
adalah fungsi built-in vim yang hanya dapat digunakan dalam perintah substitusi, dan mengembalikan string yang sama dengan regex \1
; Anda akan menggunakan submatch(2)
setara dengan regex \2
dan sebagainya. ( \0
adalah seluruh pola yang cocok, tetapi kami tidak ingin itu ada di sini.) \(
Dan \)
dalam pola pencarian digunakan untuk menandai apa yang dianggap sebagai submatch(1)
.
Oleh karena itu (submatch(1) + 50)
berikan hasil menambahkan 50 ke angka yang diikuti digit <obj param="
dalam bentuk pola pencarian.
Pembatas @
lagi digunakan untuk menandai akhir teks pengganti.
Bendera g
digunakan untuk membuat pergantian global; Anda bisa menghilangkan ini jika Anda hanya ingin mengganti instance pertama pada setiap baris.
Anda mungkin dapat bekerja dari sana cara menambahkan angka yang berbeda, atau mengurangi, atau membagi, dll.
vim
danemacs
bisa melakukan hal semacam ini, tetapi mungkin perlu menulis skrip daripada menggunakan satu perintah.