2012-03-07 20 views
5

Tôi luôn muốn biết, cách bạn có thể thay thế trong các tham số đã cho.Thay thế Vim

Nếu bạn có một dòng như thế này:

123,Hello,World,(I am, here), unknown 

và bạn wnat để thay thế World với Foobar thì đây là một nhiệm vụ dễ dàng: :%s/World/Foobar/

Bây giờ tôi tự hỏi làm thế nào tôi có thể thoát khỏi một , đó là wihtin ().

Về mặt lý thuyết, tôi chỉ phải tìm sự xuất hiện đầu tiên của ( sau đó thay thế , bằng khoảng trắng cho đến ).

+2

Vui lòng đọc mục Câu hỏi thường gặp về [khối mã định dạng trong câu hỏi và câu trả lời của bạn] (http://meta.stackexchange.com/a/22189/151830)). – Benoit

Trả lời

4

Hãy thử lookahead và lookbehind khẳng định:

%s/([^)]*\zs,\ze.*)// 

(\zs\ze cho biết nơi mô hình bắt đầu và kết thúc)

hoặc

%s/\(([^)]*\)\@<=,\(.*)\)\@=// 

Người đầu tiên là dễ đọc hơn, điều thứ hai sử dụng các nhóm \(... \) có dấu ngoặc đơn bên trong các nhóm làm cho nó trông giống như bị xáo trộn, và \@<= mà apar t từ một con vịt ASCII nghệ thuật tốt đẹp là nhà điều hành lookbehind, và \@= đó là nhà điều hành lookahead.

Tài liệu tham khảo: :help pattern (chi tiết hơn tại :help /\@=, :help /\ze, vv)

Bạn sử dụng giao diện đồ họa và muốn thử những lệnh? Sao chép chúng vào clipboard và chạy :@+ bên trong Gvim.

0

Ví dụ của bạn, đây là điều tương tự như đề nghị của @ubuntuguy

%s/\(.*\)(\(.*\),\(.*\)/\1(\2\3 

này sẽ làm việc thay thế chính xác mà bạn muốn.

+0

Thật không may, điều này sẽ loại bỏ ',' không phải là một bên trong '(' ')'. – mouviciel

1

Bạn cũng có thể chọn văn bản bạn muốn thay đổi (với chế độ visual hoặc visual-block) và nhập : để bắt đầu lệnh thay thế. vi sẽ tự động khởi động lệnh với :'<,'> áp dụng lệnh cho khu vực đã chọn.

Thay thế một , có thể được thực hiện với:

:'<,'>s/,/ /g 
2

Sửa đổi một chút câu trả lời của @ Tom có ​​thể cung cấp cho bạn một tốt yên tĩnh và "một chút" kết quả dễ đọc hơn:

%s/\(.*\)(\(.*\),\(.*\))\(.*\)/\1(\2\3)\4/ 

Bằng cách đó bạn sẽ có: trong \1 sẽ lưu trữ những gì ở bên trái bên ngoài dấu ngoặc đơn, \4 những gì ở bên phải dấu ngoặc đơn và \2\3 những gì nằm trong dấu ngoặc đơn, tương ứng ly bên trái (\2) và bên phải (\3).

Với điều đó, bạn có thể dễ dàng trao đổi các yếu tố của mình nếu tệp của bạn được sắp xếp dưới dạng cột.

+0

(bằng cách câu trả lời của Benoit thanh lịch hơn nhiều) –

0

Tuy nhiên, cách tiếp cận khác, dựa trên thực tế mà thực sự bạn muốn thay thế chỉ xuất hiện đầu tiên của , bên trong ngoặc đơn:

:%s#\((.\{-}\),#\1 # 

Giải thích:

  • :%s cho thay thế trong toàn bộ tập tin (không sử dụng % nếu bạn chỉ muốn làm việc với dòng hiện tại)
  • chúng tôi có thể sử dụng # hoặc : làm một dấu phân cách để làm cho lệnh dễ đọc hơn
  • trong (.\{-} chúng tôi yêu cầu tìm bất kỳ ký hiệu (dấu chấm) nào sau dấu ngoặc đơn trái và phần còn lại là từ 0 trở lên (ít nhất có thể) của ký hiệu này. Biểu thức này được đặt bên trong \(...\) để có thể tham chiếu đến nhóm này là \1 trong tương lai.