Saya bisa lakukan :%s/<search_string>/<replace_string>/g
untuk mengganti string di file, atau :s/<search_string>/<replace_string>/
mengganti di baris saat ini.
Bagaimana saya bisa memilih dan mengganti kata-kata dari garis selektif dalam vim?
Contoh: ganti teks dari baris 6-10
, 14-18
tetapi bukan dari 11-13
.
Jawaban:
The
:&&
perintah mengulangi substitusi terakhir dengan bendera yang sama. Anda dapat menyediakan rentang tambahan untuk itu (dan menggabungkan sebanyak yang Anda suka):Jika Anda memiliki banyak rentang , saya lebih suka menggunakan loop:
sumber
:6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&&
juga akan berfungsi,for
loop membuatnya lebih mudah diingat dan dieksekusi.:
pada perintah berikutnya adalah opsional, btw, sehingga Anda dapat menyimpan beberapa keystrokes lebih.:&&
akan menghemat ratusan penekanan tombol per minggu. Terima kasih!Menggantikan semua:
Temukan setiap kemunculan 'foo' (di semua lini), dan gantikan dengan 'bar'.
Untuk jalur tertentu:
Ubah setiap 'foo' menjadi 'bar' untuk semua baris dari baris 6 ke baris 10 inklusif.
sumber
/
, adalah di mana Anda menunjukkan tanda untuk operasi. Perintah ini biasanya akan menggantikan pertandingan pertama pada satu baris; Dengang
bendera itu akan menggantikan semua kemunculan.%
hal melakukan pekerjaan! Kalau tidak, itu hanya kejadian pertama.%
=> jalankan perintah ini di semua baris.g
=> cocok dengan beberapa kejadian di baris yang sama.Sebagai catatan, alih-alih harus mengetikkan angka garis, cukup sorot garis tempat Anda ingin menemukan / mengganti dalam salah satu mode visual:
VISUAL
mode ( V)VISUAL BLOCK
mode ( Ctrl+ V)VISUAL LINE
mode ( Shift+ V, berfungsi terbaik dalam kasus Anda)Setelah Anda memilih baris untuk diganti, ketikkan perintah Anda:
Anda akan perhatikan bahwa rentang
'<,'>
akan dimasukkan secara otomatis untuk Anda:Di sini
'<
berarti garis yang disorot pertama , dan'>
berarti garis yang disorot terakhir .Perhatikan bahwa perilaku mungkin tidak terduga ketika dalam
NORMAL
mode:'<
dan'>
arahkan ke awal dan akhir dari sorotan terakhir yang dilakukan di salah satuVISUAL
mode. Sebaliknya, dalamNORMAL
mode, nomor baris khusus.
dapat digunakan, yang berarti baris saat ini . Karenanya, Anda dapat menemukan / mengganti hanya pada baris saat ini seperti ini:Hal lain yang perlu diperhatikan adalah memasukkan kedua
:
antara rentang dan perintah find / replace tidak ada salahnya, dengan kata lain, perintah-perintah ini akan tetap berfungsi:sumber
Anda dapat melakukannya dengan dua urutan temukan / ganti
Kali kedua yang perlu Anda sesuaikan adalah rentang jadi alih-alih mengetik semuanya, saya akan mengingat perintah terakhir dan mengedit hanya rentang
sumber
Jika Anda bingung baris mana yang akan terpengaruh, Gunakan di bawah ini
Ubah setiap 'foo' menjadi 'bar', tetapi mintalah konfirmasi terlebih dahulu. Tekan 'y' untuk ya dan 'n' untuk tidak. Jangan lupa menyimpan setelah itu
sumber
c
bendera selain menentukan rentang, jadi:6,10s/<search_string>/<replace_string>/c
berfungsi.c
singkatanconfirm
. Saya sering menggunakanc
bendera untuk mencegah dari penggantian kata-kata yang tidak sengaja di mana saya tidak berpikir bahwa mereka ada di sana juga.VI mencari dan mengganti contoh perintah
Katakanlah Anda ingin menemukan kata yang disebut "foo" dan ganti dengan "bar".
[Esc]
Tombol tekan pertamaKetik: (titik dua) diikuti oleh
%s/foo/bar/
dan tekan tombol [Enter]:%s/foo/bar/
sumber
:%s/<search_string>/<replace_string>/g
Perintah Anda akan menggantikan semua kejadian di seluruh file. Bukan jawaban yang tepat untuk pertanyaan itu, tetapi tetap berguna :)Kami tidak perlu repot memasukkan nomor baris saat ini.
Jika Anda ingin mengubah masing
foo
- masing kebar
untuk baris saat ini (.
) dan dua baris berikutnya (+2
), cukup lakukan:Jika Anda ingin mengonfirmasi sebelum perubahan dilakukan, ganti
g
dengangc
:sumber
:.,$s/foo/bar/gc
mencari & mengganti mulai dari baris saat ini hingga akhir file.Cari dan ganti
g => pencarian global
c => Minta konfirmasi terlebih dahulu
i => Tidak sensitif huruf
Jika Anda ingin penggantian langsung tanpa konfirmasi, gunakan perintah di bawah ini
Jika Anda ingin konfirmasi untuk setiap penggantian maka jalankan perintah di bawah ini
Minta konfirmasi terlebih dahulu, di sini pencarian akan menjadi case-sensitive.
sumber
Menentukan rentang melalui pemilihan visual tidak apa-apa, tetapi ketika ada operasi yang sangat sederhana hanya beberapa baris yang dapat dipilih oleh operator, yang terbaik adalah menerapkan perintah ini sebagai operator.
Sayangnya ini tidak dapat dilakukan melalui perintah standar vim. Anda bisa melakukan semacam solusi menggunakan! operator (filter) dan objek teks apa pun. Misalnya, untuk menerapkan operasi ke paragraf, Anda dapat melakukan:
Ini harus dibaca sebagai "Terapkan operator! Di dalam paragraf". Operator filter memulai mode perintah dan secara otomatis memasukkan rentang garis diikuti dengan literal "!" Anda dapat menghapus setelahnya. Jika Anda menerapkan ini, ke paragraf berikut:
Hasilnya setelah menekan "! Ap" akan seperti:
Sebagai '.' (titik) berarti garis saat ini, kisaran antara garis saat ini dan 5 garis setelahnya akan digunakan untuk operasi. Sekarang Anda dapat menambahkan perintah pengganti dengan cara yang sama seperti sebelumnya.
Bagian yang buruk adalah bahwa ini tidak mudah untuk memilih teks untuk yang terakhir menerapkan operator. Bagian baiknya adalah ini dapat mengulangi penyisipan rentang untuk rentang teks serupa lainnya (dalam hal ini, paragraf) dengan ukuran yang sangat berbeda. Yaitu, jika nanti Anda ingin memilih rentang paragraf yang lebih besar '.' akan melakukannya dengan benar.
Juga, jika Anda menyukai gagasan menggunakan objek teks semantik untuk memilih rentang operasi, Anda dapat memeriksa plugin saya EXtend.vim yang dapat melakukan hal yang sama tetapi dengan cara yang lebih mudah.
sumber
Untuk menjawab pertanyaan ini:
:40,50s/foo/bar/g
ganti foo dengan bar di baris ini antara baris ke-40 dan ke-50 (termasuk), saat menjalankan perintah ini, Anda saat ini dapat berada di baris mana saja.
:50,40s/foo/bar/g
juga berfungsi, vim akan meminta Anda untuk konfirmasi dan kemudian melakukan penggantian untuk Anda seolah-olah Anda telah memasukkan perintah pertama.
:,50s/foo/bar/g
ganti foo dengan bar pada baris-baris ini di antara baris Anda saat ini dan baris ke-50 (inklusif). (jika Anda berada dalam garis SETELAH vim garis ke-50 akan meminta konfirmasi lagi)
Untuk memperjelas perbedaan antara vim dan plugin vrapper dari Eclipse:
Perhatikan bahwa dalam varpper
:,50s/foo/bar/g
perintah TIDAK akan bekerja.:50,40s/foo/bar/g
akan bekerja tanpa meminta konfirmasi.(Untuk Versi Vrapper 0.74.0 atau lebih tinggi).
sumber
Misalkan jika Anda ingin mengganti yang di atas dengan beberapa info lainnya.
COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)
Dalam hal ini di atas akan diganti dengan (
sys.pkg.mpu.umc.kdk.
).sumber
%s
untuk memodifikasi input tetapi ingin tahu bagaimana melakukannya "secara semi-global" (yaitu spesifikasinya adalah baris 6-10 dan 14-18 tetapi tidak pada baris 11- 13)./
, misalnya!
,@
,_
::%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g