Làm cách nào tôi có thể sử dụng các số liên tiếp trong lệnh thay thế kiểu Ex?


8

Ví dụ: giả sử tôi muốn đặt một số trước mỗi dòng bắt đầu bằng từ "Làm". Lệnh sẽ trông giống như vậy :%s/^(Do )/1. \1/, nhưng tôi có thể làm gì để nó sẽ áp dụng các số liên tiếp thay vì cùng một số mỗi lần?

Lưu ý rằng tôi nhận thức rõ về nhiều cách để thực hiện việc này bằng cách sử dụng macro và Ctrl-A, nhưng để sử dụng trong các lệnh Chế độ Ex phức tạp hơn, tôi muốn biết câu trả lời cho chính xác câu hỏi tiêu đề.

Đối với một ví dụ khác, cách tiếp cận vĩ mô sẽ không dễ dàng như vậy, giả sử tôi muốn nối một số cho tất cả các trường hợp của từ "Mục" và để chúng được đánh số liên tục nhưng khởi động lại số sau mỗi dòng bắt đầu "Chương". Lệnh Ex-mode gần như có thể thực hiện việc này, tiết kiệm để thực sự tăng số lượng cần thêm, là:

:g/^Chapter/;/^Chapter/-s/Section\zs/ 1/g

Bạn có thể thấy rằng một phương pháp tăng số dễ dàng trong lệnh thay thế chế độ Ex có thể rất hữu ích.

Câu trả lời:


8

Lệnh này thực hiện những gì bạn muốn:

:let i = 1|g/^Do/s/^/\=i/|let i = i + 1

Giải trình…

  • let i = 1khởi tạo bộ đếm i,
  • g/^Do/s/^/\=i/chuẩn bị icho mỗi dòng bắt đầu bằng Do,
  • let i = i + 1gia tăng i.

Bí quyết là sự gia tăng xảy ra trước khi thay thế tiếp theo.

--- biên tập ---

Nếu chúng tôi sử dụng một thay thế duy nhất, bộ đếm sẽ chỉ được tăng lên một lần, sau khi mọi thứ đã xong.

Vì chúng tôi đang thực hiện nhiều thay thế - một cho mỗi dòng khớp - thay vì một thay thế duy nhất, bộ đếm được tăng chính xác trước khi thay thế tiếp theo.


Làm thế nào bạn có thể đặt một dấu chấm sau số? \=i. là một biểu thức không hợp lệ.
David Conrad

2
@DavidConrad, .trở thành toán tử ghép trong \=biểu thức. Vì vậy, s//\=i . '. '/sẽ nối thêm '. ' Kiểm tra :help expression-syntax.
tự đại diện

sự gia tăng xảy ra sau khi thay thế
Christian Brabandt

@ChristianBrabandt, ôi tôi vô tình một từ.
romainl
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.