Thay thế bằng VIM, sử dụng lại một phần của mẫu tìm kiếm


29

Tôi đang làm việc với VImvà cố gắng thiết lập lệnh tìm kiếm và thay thế để thực hiện một số thay thế trong đó tôi có thể sử dụng lại biểu thức chính quy là một phần của chuỗi tìm kiếm của tôi.

Một ví dụ đơn giản sẽ là một dòng mà tôi muốn thay thế (10)để {10}, nơi 10 có thể được bất kỳ số.

Tôi đã đến đây

  .s/([0-9]*)/what here??/

phù hợp với chính xác phần mà tôi muốn.

Bây giờ thay thế, tôi đã thử

  .s/([0-9]*)/{\0}/

Nhưng, điều này mang lại như đầu ra {(10)}

Sau đó, tôi đã thử

 .s/(\zs[0-9]*\ze)/{\0}/

Tuy nhiên, điều đó đã cho tôi ({10}), thứ mà tôi cũng đóng, nhưng không phải thứ tôi muốn.

Tôi nghĩ rằng tôi cần một số loại đánh dấu / tham chiếu ngược khác thay vì điều này \0, nhưng tôi không biết tìm ở đâu. Vì vậy, câu hỏi là, điều này có thể được thực hiện trong vim, và nếu vậy, làm thế nào?

Câu trả lời:


37

\0là toàn bộ trận đấu. Để chỉ sử dụng một phần của nó, bạn cần đặt nó như thế này và sử dụng \ 1

.s/(\([0-9]*\))/{\1}/

Hướng dẫn chi tiết hơn bạn có thể tìm thấy ở đây hoặc trong trợ giúp vim.


Lưu ý các dấu ngoặc đơn cho việc chụp là dấu gạch chéo ngược.
Randall

0

Gần đây tôi đã thừa hưởng một số mã kế thừa và tôi muốn thay thế tất cả các lần xuất hiện như:

print "xx"
print x,y
print 'xx'

đến

logging.info("xy") 

hoặc là

logging.info(x,y)

Dựa trên câu trả lời trước và hy vọng ai đó sẽ được hưởng lợi từ nó, tôi đã sử dụng lệnh sau, điều đó sẽ thay đổi tất cả các lần xuất hiện:

%s/print\( .*\)/logging.info\(\1\)/g

Nếu bạn thay thế %với .và loại bỏ /gbạn sẽ kết thúc với

.s/print\( .*\)/logging.info\(\1\)

điều đó sẽ cho phép bạn vượt qua từng trận đấu và chọn xem bạn có thay đổi nó hay không.


0

Cách tốt hơn để cho phép bạn vượt qua mỗi trận đấu là thêm "c" vào cuối mã, thay vì đi từng dòng một

%s/print\( .*\)/logging.info\(\1\)/gc

Điều này thực sự không trả lời câu hỏi ban đầu theo bất kỳ cách nào
Bernhard
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.