Làm cách nào tôi có thể thêm một chuỗi vào cuối mỗi dòng trong Vim?


256

Tôi muốn thêm *vào cuối mỗi dòng trong Vim.

Tôi đã thử mã không thành công

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

Bạn không làm việc vì ở phía bên phải :s///, \ntương ứng với một ký tự null. Phần :help sub-replace-specialnày có liên quan.
doubleDown

Câu trả lời:


354

:%s/$/\*/g

nên làm việc. Vì vậy, :%s/$/*/gnhư MrWiggles chỉ ra chính xác.


Có cách nào để chèn ' ' vào cùng một cột không, vì tất cả các dòng không có cùng độ dài, vì vậy dòng 1 có thể có ' ' ở cột thứ 15, nhưng dòng 2 có '*' ở cột thứ 25.
Aman Jain

11
chỉ có 1 EOL trên mỗi dòng, vì vậy gcờ là không cần thiết.
doubleDown

Tôi muốn thêm / vào đầu mỗi dòng: 1, $ s / ^ / \ / g làm việc cho tôi.
farooqsadiq

@dirkgently Làm cách nào tôi có thể chuyển một biến chuỗi làm đối số cho lệnh này (bạn biết, thay vì *)?
Matheus Rotta

353

Thậm chí ngắn hơn lệnh: search:

:%norm A*

Đây là những gì nó có nghĩa là:

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

28
Man, không tồn tại chủ đề vi hoặc vim mà tôi không học được gì. Hôm nay tôi tìm hiểu về định mức. Và như họ nói tại Cheers, "Norm!"
smcameron

4
Để trả trước, bạn chỉ cần sử dụng 0i *, 0 sẽ đưa bạn đến đầu dòng, i cho chế độ chèn và * cho *. D:
Cướp

7
Là một VimGolfer, tôi không thể không thêm vào việc sử dụng I*chứ không phải 0i*giúp bạn tiết kiệm một lần nhấn phím.
Jedidiah làm tổn thương

24
Một mẹo khác: Điều này cũng làm việc cho phạm vi. Chỉ cần làm nổi bật các dòng trong chế độ trực quan và nhấn :, điều này sẽ điền trước lệnh :'<,'>mà sau đó bạn có thể thực hiện:'<,'>norm A*
Jedidiah Hurt

8
Để trả trước, hãy sử dụng Ithay thế -:%norm I*
Chỉ cần Lucky Thật sự là

42

Cũng thế:

:g/$/norm A*

Cũng thế:

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

Ahhh ... Cái thứ hai cũng có thể được sử dụng với một lựa chọn các dòng. Đẹp!
Tim Fletcher

Bạn có thể vui lòng giải thích ví dụ đầu tiên?
Thăm dò ý kiến ​​Cody

@CodyPoll ggloballệnh thực hiện điều gì đó với mọi dòng khớp. $phù hợp với mọi dòng. Nó cũng có thể ^hoặc .*. Norm thực thi các lệnh mà bạn thường sử dụng trong chế độ lệnh. Vì vậy, A*có nghĩa là nối *vào cuối dòng.
defhlt

41

Tôi nghĩ rằng sử dụng chế độ khối trực quan là một phương pháp tốt hơn và linh hoạt hơn để xử lý loại điều này. Đây là một ví dụ:

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

Để chèn "Xin chào thế giới." (dấu cách + bảng tạm) ở cuối mỗi dòng này:

  • Trên một ký tự trong dòng đầu tiên, nhấn Ctrl-V (hoặc Ctrl-Q nếu Ctrl-V được dán).
  • Nhấn jj để mở rộng khối hình ảnh qua ba dòng.
  • Nhấn $ để mở rộng khối trực quan đến cuối mỗi dòng. Nhấn A rồi khoảng trắng rồi gõ Hello world. + rồi Esc.

Kết quả là:

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

(ví dụ từ Vim.Wikia.com )


3
Thay vì nhấn jjngười ta có thể nhấn Gđể di chuyển đến dòng cuối cùng. Điều này hữu ích trong các tệp lớn, khi nhấn jcho đến khi bạn nhấn dòng cuối cùng là không thực tế.
nash

Đồng ý rằng khối hình ảnh là sạch nhất ở đây, cũng có thể mở rộng hơn
Peter Dolan

Lưu ý rằng điều này có vẻ như không hoạt động trên tất cả các dòng lúc đầu, nhưng sau khi bạn nhấn Esc, nó sẽ đi qua và thêm nó vào tất cả.
Noumenon

Visual Block gây ra các vấn đề và lỗi khi sử dụng vim như một phần mở rộng cho những thứ khác, như Mã VS. Trong những trường hợp đó, việc tìm kiếm và thay thế người dùng ban đầu đang yêu cầu là tùy chọn đáng tin cậy.
Brettins

đảm bảo bạn sử dụng Vốn A, chữ thường "a" không hoạt động.
Jeff Hoye

14

Nếu bạn muốn thêm thế giới Hello ở cuối mỗi dòng:

:%s/$/HelloWorld/

Nếu bạn muốn làm điều này với số lượng dòng cụ thể, từ 20 đến 30 sử dụng:

:20,30s/$/HelloWorld/

Nếu bạn muốn làm điều này ở đầu mỗi dòng thì sử dụng:

:20,30s/^/HelloWorld/

6

Bạn không thực sự cần gđến cuối cùng. Vì vậy, nó trở thành:

:%s/$/*

Hoặc nếu bạn chỉ muốn *ở cuối, hãy nói dòng 14-18:

:14,18s/$/*

hoặc là

:14,18norm A*

5

... và để thêm vào (thêm phần đầu) mỗi dòng bằng *,

%s/^/*/g

Điều này không trả lời câu hỏi.
doubleDown

5

Một lựa chọn là:

:g/$/s//*

Điều này sẽ tìm thấy tất cả các dòng kết thúc neo và thay thế nó bằng *. Tôi nói "thay thế" nhưng thực tế, nó giống như một phần phụ vì mỏ neo là một thứ đặc biệt hơn là một nhân vật thông thường. Để biết thêm thông tin, xem Sức mạnh của g - Ví dụ .


S // có nghĩa là gì trong regex? Tôi biết một lệnh tương tự ,: g / / / p, (grep). Tôi khá chắc chắn rằng lệnh của bạn gần với lệnh của tôi, ít nhất là trong cấu trúc.
Léo Léopold Hertz

1
S là thay thế - nó thay thế điểm cuối của dòng neo bằng dấu hoa thị (tốt, không thực sự thay thế nó vì đó là điểm neo).
paxdiablo

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

Cái đầu tiên của bạn là chính xác ở bất cứ nơi nào khác, nhưng Vim phải xử lý dòng mới khác nhau vì một số lý do.


Trong phiên bản Vim \ n của tôi hoạt động, nhưng điều này chỉ thay thế dòng mới bằng dấu *, nối các dòng một cách hiệu quả.
Nathan Fellman

1
Lệnh này được xác minh để hoạt động tốt trên mọi phiên bản Vim tôi đã thử. Bạn đang sử dụng phiên bản windows hay cái gì đó?

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

điều này sẽ thực hiện thủ thuật và đảm bảo các không gian hàng đầu bị bỏ qua.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.