私のfortranコードには、次のような多くのブロックがあります
subroutine name(arg1,arg2,arg3,...)
:
end subroutine
そして私は彼らになってほしい
subroutine name(arg1,arg2,arg3,...)
:
end subroutine name
これらの各ブロックは、任意の量のスペースでインデントできます(実際、そのようなブロックはネストできます)。コマンドで試してみました
:g/^ *subroutine \(.*\)/;/end subrout/s/end subroutine/& \1
バッファ\1
が空であるように、これは各行を変更します(一番下の行でそれを読みます)。コマンド
:g/^ *subroutine \(.*\)/;/end subrout/s/end subroutine/& hello
うまく機能しますが、明らかに私が望んでいるものではありません。だから問題は、グローバルexコマンドで一致したパターンを置換文字列でどのように使用できる:g
かです。
編集 質問を編集しているのは、投稿した時点で、私が参照した特定のケースに対する回答である回答を急いで受け入れたが、質問のタイトルは少し一般的ではなかったためです。
私は要点に行きます。私は次のようなファイルを持っています(できるだけ一般的にするだけで意味がありません)。
# 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
(実際、各#
-lineに続く行は数百です。)
各#
-lineに続く(そして次の#
-lineに先行する)すべての行で置換を行わなければなりません。これらの置換はすべて、先頭の#
行(またはその一部)の後のテキストを使用する必要があります。私が達成したい一例は
# 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
#
次の行には、最初の単語だけが挿入されることに注意してください。
だから、すでに言ったように、:g
コマンドのパターンが代替文字列で使用できるかどうか知りたい。マクロを登録するのは非常に煩わしいので、この答えにとても興味があります(1つの間違ったキーストロークは最初からやり直すことを意味します)。
:g/^# \(\<\w\+\>\)/+;/^#/- s/\(\<\w\+\>\)\(.\+$\)/\2 \1 \3
完璧になります!...そして、私が仕事をするコマンドを使用する方法がないことを信じるのは難しいです!
norm!
%
からの殺害matchit
。ソリューション::%g/^\s*subroutine/norm ^whye^%$p
。