2009-06-10 39 views
6

Tôi cần phải thay thế một danh sách các từ bằng một danh sách từ dài.Vim thay thế danh sách các từ có cùng danh sách từ khác?

Vì vậy, ví dụ bạn có: "a", "b", "c", "d", "e", "f"

Và bạn muốn thay thế từng từ với phiên bản chữ hoa của mỗi từ: "A", "B", "C", "D", "E", "F"

Tôi biết cách tìm mỗi chuỗi bằng regex: (a \ | b \ | c \ | d \ | e \ | f)

Tôi biết bạn có thể thay thế toàn cầu cho từng từ. Nhưng khi chiều dài của các từ được lớn, cách tiếp cận này sẽ trở nên không có hiệu quả và không phù hợp.

Có cách nào để thực hiện một thay thế toàn cầu nào đó không? Tương tự như:

:%s/\(a\|b\|c\|d\|e\|f\)/INSERT_REPLACEMENT_LIST/ 

Tôi không chắc liệu điều này có thể thực hiện được hay không.

+1

Chỉ để thỏa mãn sự tò mò của tôi, bạn có thể nói, đây là cái gì? Ý tôi là, điều gì là tốt cho, trong thực tế? Không có gì đến tâm trí, vì vậy tôi đã tự hỏi. – Rook

+0

@ Idigas, tôi đang thực hiện một loạt việc tái cấu trúc trên một số mã Matlab xấu. Tôi nhận thấy rằng mã sử dụng như 20-30 globals và globals của ông không phải là tất cả các chữ hoa hoặc được đặt tên theo cách như vậy để làm cho chúng rõ ràng là toàn cầu. -> SO Tôi muốn đổi tên tất cả thành chữ hoa. Hoặc có thể cùng tên nhưng thêm "_g" sau mỗi tên biến. –

+0

@ Idigas, cuối cùng tôi sẽ thực hiện Matlab trong C. Vì vậy, tôi muốn hiểu đầy đủ và làm cho mã càng thanh lịch càng tốt trước khi chuyển sang C. –

Trả lời

9

Bạn có thể sử dụng từ điển các mục được ánh xạ tới các thay thế của chúng, sau đó sử dụng từ khóa đó ở bên phải của tìm kiếm/thay thế.

:let r={'a':'A', 'b':'B', 'c':'C', 'd':'D', 'e':'E'} 
:%s/\v(a|b|c|d|e)/\=r[submatch(1)]/g 

Xem :h sub-replace-\=:h submatch(). Nếu bạn muốn nhồi nhét thành một dòng, bạn có thể sử dụng từ điển theo nghĩa đen.

:%s/\v(a|b|c|d|e)/\={'a':'A','b':'B','c':'C','d':'D','e':'E'}[submatch(1)]/g 

Ví dụ cụ thể mà bạn đã cung cấp của uppercasing chữ sẽ được đơn giản hơn thực hiện như

:%s/[a-e]/\U\0/g 
+0

s/\\ (\ a \ + \\)/\ U \ 0/g để thay đổi trình tự của các ký tự chữ cái thành chữ hoa. –

+1

Nếu bạn thấy mình làm điều này thường xuyên, bạn xác định một hàm vim cho điều này (http://stackoverflow.com/questions/765894/can-i-substitute-multiple-items-in-a-single-regular-expression-in -vim-or-perl/766093 # 766093) – rampion

+0

@Brian, "\ v" thay thế của bạn là gì? –

2

:% s/(a ​​\ | b \ | c \ | d \ | e \ | f)/\ U \ 0/g

Các vấn đề liên quan