Saya memiliki sejumlah baris dalam file, dan saya ingin menyalin setiap baris 11 kali (mengubah setiap baris menjadi 12 baris), dan menambahkan "1" terakhir di setiap baris sehingga 12 baris memiliki "1" hingga " 12 ", di mana" 1 "awalnya berada. Mungkin ada kejadian lain dari "1" di setiap baris, tetapi "1" yang ingin saya tambahkan akan selalu menjadi kejadian terakhir di setiap baris. Cara lain untuk melihatnya adalah "1" terakhir selalu setelah "/ nt /" - seperti pada "/ nt / 1" (dan itu akan selalu menjadi satu-satunya kejadian "/ nt / 1" di setiap baris) .
Jadi, misalnya, jika saya punya:
1stlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/1blah
3rdlineblahblahblah/nt/1blah
Saya ingin mengubahnya menjadi:
1stlineblahblahblah/nt/1blah
1stlineblahblahblah/nt/2blah
1stlineblahblahblah/nt/3blah
1stlineblahblahblah/nt/4blah
1stlineblahblahblah/nt/5blah
1stlineblahblahblah/nt/6blah
1stlineblahblahblah/nt/7blah
1stlineblahblahblah/nt/8blah
1stlineblahblahblah/nt/9blah
1stlineblahblahblah/nt/10blah
1stlineblahblahblah/nt/11blah
1stlineblahblahblah/nt/12blah
2ndlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/2blah
2ndlineblahblahblah/nt/3blah
...
Saya sebelumnya telah menemukan perintah:
:for i in range(0,12) | put ='1stlineblahblahblah/nt/'.i.'blah' | endfor
berfungsi untuk tujuan ini, tetapi saya harus secara manual menjalankan perintah ini untuk setiap baris, dan ketik setiap baris di (atau salin dan tempel) sendiri. Apakah ada cara untuk mengambil baris yang sudah ada dalam file, dan jalankan saja satu perintah yang mengubah setiap baris menjadi dua belas, dengan cara yang telah saya jelaskan?
Terima kasih sebelumnya kepada siapa saja yang dapat membantu saya dengan ini. Saya juga hanya ingin mencatat bahwa ini adalah pertanyaan kedua saya di sini, dan saya senang mendapatkan beberapa solusi cepat dan efektif untuk pertanyaan pertama saya, yang paling saya syukuri.
sumber
Anda bisa melakukannya dengan
global
perintah ex untuk menjalankan makro n beberapa kali untuk setiap baris dalam file.Setelah merekam makro, batalkan perubahan yang dilakukan saat merekam, atau akan ada n + 1 baris tambahan untuk baris pertama, dan n untuk baris berturut-turut.
Rekam makro ke
a
register denganIni mencatat ke register
a
(qa...q
) perintah berikut:yyp
: duplikat baris saat ini$
: pindah ke akhir baris?\d<CR>
: cari mundur satu digit<C-A>
: increment digit di bawah kursor per satuSaat makro direkam, hapus perubahan yang dibuat saat merekamnya dengan membatalkan (
uu
) atau dengan menghapus baris saat ini (dd
). Kemudian ulangi makro11
(atau berapa kali) kali untuk setiap baris dalam file dengan perintah global:sumber
Dua arah:
Gunakan makro!
Dimulai dengan
Dengan kursor Anda di baris pertama
Yang tidak:
qq
Mulai merekam makro ke dalam register qyyp
tarik garis saat ini, dan rekatkan di bawah ini$?\d<CR>
Pergi ke akhir baris, dan temukan digit pertama yang melihat ke belakang<Ctrl-a>
Tambahkan nomornyaq
Berhenti merekam makro.Ini membuat Anda dengan:
Dengan kursor di baris kedua. Cukup ulangi makro ini sebanyak yang diinginkan (Misalnya, ulangi sepuluh kali dengan 10 @ q). Jika Anda ingin mengotomatiskan proses ini untuk setiap baris, jalankan secara global di setiap baris:
:g//normal 11@q
Atau, dengan versi vim yang lebih baru: Tempel garis yang Anda inginkan namun berkali-kali, blok visual pilih digit yang ingin Anda tambahkan, dan tekan
g <Ctrl-a>
. Ini harus menambah semua angka di blok visual sesuai keinginan Anda. Namun ini adalah proses yang lebih manual.sumber
g <c-a>
caranya. Terima kasih telah berbagi.Saya merasa paling mudah untuk menggunakan makro untuk tugas sekali pakai seperti itu. Mulailah merekam makro dengan
q
+ nama register dan lakukan tugas sekali. Saya melihat satu tugas berulang di sini:Sekarang, rekam penekanan tombol yang diperlukan untuk mendaftar
a
, dalam mode normal:Hapus baris lagi untuk menguji apakah mengeksekusi makro 11 kali menghasilkan hasil yang tepat untuk satu baris:
Itu benar! Jadi mari undo lagi dan mengotomatiskan seluruh proses dalam makro kedua
b
:Sekarang Anda dapat mengeksekusi
@b
sampai akhir file dan itu akan menghasilkan output yang Anda inginkan. Kedengarannya rumit tetapi sebenarnya tidak begitu Anda terbiasa dengan pola pengeditan yang khas.sumber
qaVyp$b<c-a>
. Atau lebih baik, hanyaqayyp$b<c-a>
.qqyyp$?\d<CR><Ctrl-a>q
oleh @fruglemonkey dan @jjaderberg lebih baik karena mencari nomor terakhir saya akan mengubahnya untuk kelengkapan..Simpan makro berikut dan gunakan untuk setiap baris:
Perbedaan utama dari jawaban lain adalah bahwa hal ini digunakan
g<C-a>
pada pemilihan kolom yang menambah setiap baris dengan nomor yang berbeda. Periksa:help v_g_CTRL-A
informasi lebih lanjut. Saya juga terbiasa\zs
memilih posisi awal pola, sehingga kursor berhenti pada nomor setelah pencarian.Harap dicatat bahwa Anda memerlukan versi terbaru Vim agar ini berfungsi.
sumber
g<C-a>
itu @fruglemonkey dan Anda merujuk, tapi terima kasih telah merespons. Saya harus mencatat bahwa ketika mencoba makro Anda - tepat sebelum saya sampai keg<C-a>
bagian, itu bukan karakter "1" terakhir yang saya ingin selesaikan yang mendapat blok-highlight, tetapi karakternya sebelum yang pertama "1 "karakter yang disorot blok. (Juga, saya pikir itu akan terjadiyy11p
dan10j
dalam makro, karena saya ingin menambahkan 11 baris - untuk total 12.)\zs
, tetapi saya bisa saja menambahkanl
setelah<CR>
.vim -u NONE
. Saya baru saja melakukan itu dan ini bekerja dengan sempurna! Bahkan, tidak mungkin pencarian akan cocok dengan 1 pertama karena membutuhkan garis miring sebelumnya.