Sau khi chọc thêm một chút, hóa ra vim có thể làm điều đó với một lệnh duy nhất, mà không cần kịch bản. Ví dụ: để thêm 50 vào tất cả các số sau <obj param="
bạn có thể sử dụng:
:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g
Hãy để tôi phá vỡ nó.
:
là cách chung để nhập / biểu thị chế độ dòng lệnh trong vim.
%
có nghĩa là trong phạm vi của toàn bộ tài liệu; thay vào đó, bạn có thể đặt trong một phạm vi số, ví dụ, 1,50
chỉ thực hiện trong 50 dòng đầu tiên.
s
là viết tắt để thay thế (bạn có thể viết toàn bộ từ nếu bạn thích)
@
là dấu phân cách; bạn có thể sử dụng bất kỳ ký tự nào khác miễn là nó không nằm trong những gì bạn đang tìm kiếm. Chỉ cần sử dụng ba lần. (Cú pháp tương tự sed
.)
Tất cả mọi thứ cho đến lần xuất hiện tiếp theo của dấu phân cách @ là mẫu reg ex để tìm kiếm, trong trường hợp này <obj param="
tiếp theo \d\+
là số chữ số bất kỳ. Các \(
và \)
đang có để thiết lập toàn bộ chuỗi này các chữ số là một nhóm đơn reg cũ mà sẽ phù hợp với backreferences như \1
, hoặc vim của submatch
lệnh.
Sau đó, dấu phân cách @
đánh dấu những gì tiếp theo là văn bản thay thế.
Ở \=
đầu ở đây có nghĩa là để thay thế kết quả của một số biểu thức được đánh giá, thay vì một mẫu hoặc chuỗi reg ex, là chìa khóa ở đây.
Sau đó, chúng tôi đã '<obj param="'
bắt đầu các văn bản thay thế. Tiếp .
theo là chức năng của vim để nối chuỗi.
submatch(1)
là một hàm dựng sẵn vim chỉ có thể được sử dụng trong lệnh thay thế và trả về chuỗi giống như biểu thức chính quy \1
; bạn sẽ sử dụng submatch(2)
tương đương với regex \2
, v.v. ( \0
Là mô hình phù hợp với tổng thể, nhưng chúng tôi không muốn điều đó ở đây.) Các \(
và \)
trong mô hình tìm kiếm được sử dụng để đánh dấu tắt những gì đếm như submatch(1)
.
Do đó (submatch(1) + 50)
đưa ra kết quả của việc thêm 50 vào số mà các chữ số theo sau <obj param="
trong mẫu mẫu tìm kiếm.
Dấu phân cách @
một lần nữa được sử dụng để đánh dấu phần cuối của văn bản thay thế.
Cờ g
được sử dụng để làm cho sự thay thế toàn cầu; bạn có thể bỏ qua phần này nếu bạn chỉ muốn thay thế phiên bản đầu tiên trên mỗi dòng.
Bạn có thể tìm ra cách thêm các số khác nhau, hoặc trừ hoặc chia, v.v.
vim
vàemacs
có thể làm điều này, nhưng nó có thể yêu cầu viết một kịch bản thay vì sử dụng một lệnh duy nhất.