Trong mã fortran của tôi, tôi có rất nhiều khối như sau
subroutine name(arg1,arg2,arg3,...)
:
end subroutine
và tôi muốn họ trở thành
subroutine name(arg1,arg2,arg3,...)
:
end subroutine name
Trong đó mỗi khối này có thể được thụt vào bởi bất kỳ số lượng khoảng trắng nào (trên thực tế, các khối đó có thể được lồng vào nhau). Tôi đã thử với lệnh
:g/^ *subroutine \(.*\)/;/end subrout/s/end subroutine/& \1
thay đổi từng dòng (tôi đọc nó ở dòng dưới cùng) không thay đổi gì, giống như bộ đệm \1
trống. Lệnh
:g/^ *subroutine \(.*\)/;/end subrout/s/end subroutine/& hello
hoạt động tốt, nhưng rõ ràng không phải là những gì tôi muốn. Vì vậy, câu hỏi là: làm thế nào tôi có thể sử dụng trong chuỗi thay thế một mẫu phù hợp với lệnh ex toàn cầu :g
?
EDIT Tôi đang chỉnh sửa câu hỏi vì tại thời điểm tôi đăng nó, tôi vội vàng chấp nhận câu trả lời là câu trả lời cho trường hợp cụ thể mà tôi đã đề cập, nhưng không phải là tiêu đề của câu hỏi, nói chung chung hơn một chút.
Tôi đi đến điểm. Tôi có một tệp như sau (không có ý nghĩa chỉ để làm cho nó chung chung nhất có thể):
# sec1
fun1 are you a function?
fun2 no.
fun3 ok, nice to meet you!
# 2nd part
first line
third line
ops (it was the second)
there were 3 lines in the preceding #
# fourth group
now there's just one
and foreveeer
(Trên thực tế, các dòng theo sau mỗi #
dòng là hàng trăm.)
Tôi phải thay thế trong mỗi dòng theo từng #
dòng (và trước #
dòng sau ); tất cả những sự thay thế này nên sử dụng văn bản sau #
dòng đầu (hoặc một phần của nó). Một ví dụ về tôi muốn đạt được là
# sec1
fun1 in sec1 are you a function?
fun2 in sec1 no.
fun3 in sec1 ok, nice to meet you!
# 2nd part
first in 2nd line
third in 2nd line
ops in 2nd (it was the second)
there in 2nd were 3 lines in the preceding #
# fourth group
now in fourth there's just one
and in fourth foreveeer
Lưu ý rằng chỉ từ đầu tiên sau #
được chèn vào các dòng sau.
Vì vậy, như tôi đã nói, tôi muốn biết liệu mô hình của :g
lệnh có thể được sử dụng trong chuỗi thay thế hay không. Tôi rất quan tâm đến câu trả lời này vì rất khó chịu khi đăng ký một macro (một lần nhấn phím sai có nghĩa là bắt đầu lại từ đầu!), Trong khi một lệnh như thế này,
:g/^# \(\<\w\+\>\)/+;/^#/- s/\(\<\w\+\>\)\(.\+$\)/\2 \1 \3
sẽ là hoàn hảo ... Và thật khó để tôi tin rằng không có cách nào để sử dụng một lệnh thực hiện công việc!
norm!
Giết chết%
từmatchit
. Giải pháp ::%g/^\s*subroutine/norm ^whye^%$p
.