tôi có thể sử dụng
:5,12s/foo/bar/g
để tìm kiếm foovà thay thế nó bằng bargiữa dòng 5 và 12. Làm cách nào tôi có thể thực hiện điều đó chỉ ở dòng 5 và 12 (chứ không phải ở các dòng ở giữa)?
Câu trả lời:
Vim có các nguyên tử biểu thức chính quy đặc biệt khớp trong các dòng, cột nhất định, v.v.; bạn có thể sử dụng chúng (có thể ngoài phạm vi) để giới hạn các kết quả phù hợp:
:5,12s/\(\%5l\|\%12l\)foo/bar/g
Xem :help /\%l
Bạn có thể thực hiện thay thế ở dòng 5 và lặp lại nó với nỗ lực tối thiểu ở dòng 12:
:5s/foo/bar
:12&
Như Ingo đã chỉ ra, hãy :&quên cờ của bạn. Vì bạn đang sử dụng /g, lệnh chính xác sẽ là :&&:
:5s/foo/bar/g
:12&&
Xem :help :&và bạn bè.
:&để sử dụng điều tối nghĩa . Nếu có cờ ( s/../../g), người ta phải sử dụng :&&, mặc dù ...
\(\%5l\|\%12l\)là tối nghĩa hơn:&
Bạn luôn có thể thêm một cvào cuối. Điều này sẽ yêu cầu xác nhận cho mỗi và mọi trận đấu.
:5,12s/foo/bar/gc
glá cờ đang diễn ra)
n5 hoặc 6 lần có khó hơn việc thêm \(\%5l\|\%12l\)vào câu lệnh thay thế?
Câu hỏi thú vị. Có vẻ như chỉ có lựa chọn phạm vi và không có lựa chọn nhiều dòng:
http://vim.wikia.com/wiki/Ranges
Tuy nhiên, nếu bạn có điều gì đó đặc biệt ở dòng 5 và 12, bạn có thể sử dụng :gtoán tử. Nếu tệp của bạn trông giống như thế này (số chỉ để tham khảo):
1 line one
2 line one
3 line one
4 line one
5 enil one
6 line one
7 line one
8 line one
9 line one
10 line one
11 line one
12 enil one
Và bạn muốn thay thế onebằng enotrên các dòng có enilthay vì line:
:g/enil/s/one/eno/
Bạn có thể sử dụng ed- một trình soạn thảo văn bản hướng dòng với các lệnh tương tự như vi và vim. Nó có lẽ có trước vi và vim.
Trong một tập lệnh (sử dụng tài liệu tại đây xử lý đầu vào cho đến khi đánh dấu EndCommand), nó sẽ giống như sau:
ed file <<EndCommands
5
s/foo/bar/g
7
s/foo/bar/g
wq
EndCommands
Rõ ràng, các lệnh ed cũng có thể được sử dụng trên dòng lệnh.
vimpháp thay thế.
:s, nhưng vẫn có sự trùng lặp của :slệnh (mà giải pháp của romainl tránh được).
sed, mặc dù ...