Các dòng trùng lặp bắt đầu bằng cách xx, thay thế xx trong trùng lặp với xóa y?


9

Tôi có một tập tin với mẫu sau:

foo 111
baz
foo 222
baz
foo 333
baz

cần phải biến thành

foo 111
bar 111
baz
foo 222
bar 222
baz
foo 333
bar 333
baz

Vì vậy, sao chép tất cả các dòng bắt đầu bằng foovà chỉ thay đổi footrong bản sao nhưng giữ nguyên phần còn lại của dòng (khác nhau trong từng trường hợp). làm như thế nào?


Nếu bạn không bị ràng buộc địa ngục trên regrec, macro sẽ hoạt động tốt. Không thực sự quan trọng lắm trong những trường hợp đơn giản như thế này, nhưng nếu bạn có điều gì đó phức tạp hơn một chút thì đó là một sự thay thế rất hợp lệ.
PhilippFrank

Câu trả lời:


19

Ở đây bạn đi:

:g/foo/t.|s//bar

Đang phân hủy:

:g/foo/    " start a global command applied on all lines matching 'foo'
t.         " duplicate the current line (the cursor is now on the new line)
|          " chain a new command
s//bar     " substitute the last searched element with 'bar'

Bởi vì glệnh sẽ cập nhật mẫu tìm kiếm, vì vậy bạn có thể bỏ qua mẫu để thay thế trong lệnh thay thế. (ref : :h :g, tìm kiếm search pattern).


Phiên bản cũ hơn:

:g/foo/norm! yyp:s/foo/bar^M

Đang phân hủy:

:g            start a global command
/foo/         apply only on lines having 'foo'
norm!         execute a normal command
yyp           duplicate the line
:s//bar       replace foo with bar on the line (the duplicated one)
^M            add enter to execute the substitution

Để chèn ^Mbáo chí Ctrl+venter.

Lưu ý : Ban đầu tôi đã đưa ra phiên bản "cũ hơn", trước khi tôi biết về tlệnh này. Tôi sẽ bỏ nó nhưng tôi sẽ không khuyên bạn nên sử dụng nó. Cái đầu tiên sạch sẽ đơn giản hơn.


Được giải quyết, 'phiên bản đơn giản hơn' hoạt động hoàn hảo. Tuy nhiên, phiên bản đầu tiên dẫn đến dòng trùng lặp vẫn bắt đầu bằng foo....
LB7979

lạ, bạn đã nhập ^Mnhư tôi giải thích?
nobe4

Xấu của tôi, đã không đọc tốt. Giải pháp đầu tiên là tốt!
LB7979

Tôi không biết tại sao bạn bận tâm bao gồm cả phiên bản phức tạp. Phiên bản đơn giản hơn ... đơn giản hơn. ;) (Không đề cập đến việc tuân thủ POSIX.) Tại sao không đặt nó lên hàng đầu?
tự đại diện

1
Ban đầu tôi đã đưa ra phiên bản đầu tiên, điều này tự nhiên hơn đối với tôi, vì tại thời điểm đó tôi không biết t, và sau đó tôi đã thêm phiên bản thứ hai. Tôi sẽ thay đổi thứ tự, bạn đã đúng. Làm thế nào về cái đầu tiên là POSIX?
nobe4

1

Tôi làm những việc như thế này mọi lúc và chỉ làm một việc như thế %s/^foo \(.*\)/foo \1\rbar \1/(một phần vì tôi cũng làm rất nhiều nhiệm vụ tương tự không thể biến thành thứ gì đó thông minh bằng cách sử dụng chức năng sao chép và \(.*\)là một phần của bộ nhớ cơ bắp của tôi bây giờ).

Tôi nghi ngờ nó không tuân thủ POSIX (nó không hoạt động trên các bản sao vi khác), nhưng sử dụng ^M( C-VReturn) thay vì \rdường như hoạt động trên hầu hết các bản sao vi khác.

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.