Bagaimana saya bisa menambahkan string ke akhir setiap baris di Vim?


257

Saya ingin menambahkan *ke akhir setiap baris di Vim.

Saya mencoba kode tidak berhasil

:%s/\n/*\n/g

Milik Anda tidak berfungsi karena di sisi kanan :s///, \nsesuai dengan karakter nol. Bagian :help sub-replace-specialini relevan.
doubleDown

Jawaban:


355

:%s/$/\*/g

harus bekerja. Jadi harus :%s/$/*/gseperti yang ditunjukkan MrWiggles dengan benar.


Apakah ada cara untuk memasukkan ' ' pada kolom yang sama, karena semua baris tidak memiliki panjang yang sama, jadi baris 1 mungkin memiliki ' ' di kolom ke-15, tetapi baris 2 memiliki '*' di kolom ke-25.
Aman Jain

11
hanya ada 1 EOL per baris, jadi gbendera tidak perlu.
doubleDown

Saya ingin menambahkan / ke awal setiap baris: 1, $ s / ^ / \ / g bekerja untuk saya.
farooqsadiq

@ luar biasa Bagaimana saya bisa meneruskan variabel string sebagai argumen untuk perintah ini (Anda tahu, bukan *)?
Matheus Rotta

353

Bahkan lebih pendek dari: perintah pencarian:

:%norm A*

Inilah artinya:

 %       = for every line
 norm    = type the following commands
 A*      = append '*' to the end of current line

28
Sobat, tidak ada utas vi atau vim dari mana saya tidak belajar sesuatu. Hari ini saya belajar tentang norma. Dan seperti yang mereka katakan di Cheers, "Norm!"
smcameron

4
Untuk prapembuatan, Anda cukup menggunakan 0i *, 0 akan membawa Anda ke awal baris, i untuk mode insert, dan * untuk *. D:
Rob

7
Sebagai VimGolfer saya tidak bisa membantu tetapi menambahkan bahwa menggunakan I*daripada 0i*akan menghemat satu keystroke.
Jedidiah Hurt

24
Satu tip lainnya: Ini juga berfungsi untuk rentang. Cukup sorot garis-garis dalam mode visual dan tekan :, ini akan mengisi awal perintah :'<,'>yang dengannya Anda bisa membuatnya menjadi:'<,'>norm A*
Jedidiah Hurt

8
Untuk mengawali, gunakan Isebagai gantinya -:%norm I*
Just Lucky Really

42

Juga:

:g/$/norm A*

Juga:

gg<Ctrl-v>G$A*<Esc>

Ahhh ... Yang kedua bisa digunakan dengan pilihan garis juga. Bagus!
Tim Fletcher

Bisakah Anda jelaskan contoh pertama?
Polling Cody

@CodyPoll gadalah globalperintah yang melakukan sesuatu pada setiap baris yang cocok. $cocok dengan setiap baris. Bisa juga ^atau .*. norma menjalankan perintah yang biasanya Anda gunakan dalam mode perintah. Jadi A*berarti menambahkan *ke akhir baris.
defhlt

41

Saya pikir menggunakan mode blok visual adalah metode yang lebih baik dan lebih fleksibel untuk menangani hal semacam ini. Ini sebuah contoh:

This is the First line.  
This is the second.  
The third.

Untuk menyisipkan "Halo dunia." (spasi + papan klip) di akhir setiap baris ini:

  • Pada karakter di baris pertama, tekan Ctrl-V (atau Ctrl-Q jika Ctrl-V di-paste).
  • Tekan jj untuk memperpanjang blok visual lebih dari tiga baris.
  • Tekan $ untuk memperpanjang blok visual ke akhir setiap baris. Tekan A lalu spasi lalu ketikkan Hello world. + lalu Esc.

Hasilnya adalah:

This is the First line. Hello world.  
This is the second. Hello world.  
The third. Hello world.  

(contoh dari Vim.Wikia.com )


3
Alih-alih menekan jjsatu dapat menekan Guntuk pindah ke baris terakhir. Ini berguna dalam file besar, di mana menekan jsampai Anda menekan baris terakhir tidak praktis.
nash

Setuju bahwa blok visual terbersih di sini, lebih dapat diperluas
Peter Dolan

Perhatikan bahwa ini sepertinya tidak bekerja pada semua baris pada awalnya, tetapi setelah Anda menekan Esc, ia akan melanjutkan dan menambahkannya ke semua.
Noumenon

Blok Visual menyebabkan masalah dan kesalahan saat menggunakan vim sebagai ekstensi untuk hal-hal lain, seperti VS Code. Dalam kasus tersebut, pencarian dan penggantian yang diminta pengguna asli adalah opsi yang andal.
Brettins

pastikan Anda menggunakan huruf kapital A, huruf kecil "a" tidak berfungsi.
Jeff Hoye

14

Jika Anda ingin menambahkan Hello world di akhir setiap baris:

:%s/$/HelloWorld/

Jika Anda ingin melakukan ini untuk jumlah baris tertentu, mulai dari 20 hingga 30 gunakan:

:20,30s/$/HelloWorld/

Jika Anda ingin melakukan ini pada awal setiap baris kemudian gunakan:

:20,30s/^/HelloWorld/

6

Anda tidak benar-benar membutuhkannya gdi akhir. Jadi itu menjadi:

:%s/$/*

Atau jika Anda hanya menginginkannya *di akhir, ucapkan baris 14-18:

:14,18s/$/*

atau

:14,18norm A*


5

Salah satu opsi adalah:

:g/$/s//*

Ini akan menemukan setiap jangkar ujung baris dan menggantinya dengan *. Saya mengatakan "pengganti" tetapi, pada kenyataannya, ini lebih merupakan tambahan karena jangkar adalah hal yang istimewa daripada karakter biasa. Untuk informasi lebih lanjut, lihat Kekuatan g - Contoh .


Apa maksud s // di regex? Saya tahu perintah yang sama,: g / / / p, (grep). Saya cukup yakin bahwa perintah Anda dekat dengan saya, setidaknya dalam struktur.
Léo Léopold Hertz 준영

1
S adalah pengganti - ia menggantikan ujung jangkar garis dengan tanda bintang (yah, sebenarnya tidak menggantikannya karena itu adalah titik jangkar).
paxdiablo

3
:% s / \ n / * \ r / g

Yang pertama Anda benar di tempat lain, tetapi Vim harus memiliki penanganan baris baru yang berbeda untuk beberapa alasan.


Dalam versi saya dari Vim \ n berfungsi, tetapi ini hanya menggantikan baris baru dengan *, secara efektif bergabung dengan garis.
Nathan Fellman

1
Perintah ini diverifikasi agar berfungsi dengan baik pada setiap versi Vim yang saya coba. Apakah Anda menggunakan versi windows atau sesuatu?

1
%s/\s*$/\*/g

ini akan melakukan trik, dan memastikan ruang terkemuka diabaikan.

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.