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
Léo Léopold Hertz 준영
sumber
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.

secara langsung
sumber
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
Cyber ​​Oliveira
sumber
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>
Brian Carper
sumber
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 )

nicole
sumber
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/
utkarsh
sumber
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*
Pedro Norwego
sumber
5

... dan untuk menambahkan (menambahkan awal) setiap baris dengan *,

%s/^/*/g
JohnnyCoder
sumber
Ini tidak menjawab pertanyaan.
doubleDown
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 .

paxdiablo
sumber
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.


sumber
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.

ng.
sumber