2012-05-02 36 views
11

Tôi đang cố gắng để thay thế tất cả xảy ra hello(...) bởi hello[...]vim thay thế regex

tôi đã cố gắng những thứ như %s/hello\((.*?)\)/hello\[$1\]/ mà không cần bất kỳ sự thành công

Bất kỳ sự giúp đỡ xin?

Trả lời

16

Đó là cú pháp Perl, không phải Vim. Trong biểu thức chính quy Vim, ít nhất theo mặc định, dấu ngoặc đơn phù hợp với chính mình và dấu ngoặc đơn bị gạch chéo ngược - đối diện với Perl. Ngoài ra, Vim không hiểu công cụ sửa đổi không tham lam ? và các nhóm chụp được nội suy với \n, không phải $n. Hãy thử điều này:

%s/hello(\([^)]*\))/hello[\1]/ 

Ngoài ra, bạn có thể sử dụng modifier \v ("rất kỳ diệu") để thực hiện hành vi liên quan đến ký tự đặc biệt và dấu xồ nguợc hơn Perl giống với, mặc dù nó không làm cho Vim hiểu *? hay thay đổi cú pháp nội suy của nó:

%s/\vhello\(([^)]*)\)/hello[\1]/ 

Ngoài ra, lưu ý rằng bạn không cần backslashes trên dấu ngoặc vuông trong văn bản thay thế - ở phía bên tay phải của một lệnh thay thế là không một biểu hiện thường xuyên, vì vậy bạn don không phải lo lắng về hầu hết các ký tự tại là đặc biệt trong một. Khá nhiều chỉ dấu gạch chéo ngược chính nó là đặc biệt, và có thể được sử dụng để bao gồm các nhóm chụp hoặc một thể hiện chữ của chính nó hoặc dấu phân cách.