In meinem fortran-Code habe ich viele Blöcke wie die folgenden
subroutine name(arg1,arg2,arg3,...)
:
end subroutine
und ich möchte, dass sie werden
subroutine name(arg1,arg2,arg3,...)
:
end subroutine name
Wo jeder dieser Blöcke durch eine beliebige Anzahl von Leerzeichen eingerückt werden kann (tatsächlich können solche Blöcke verschachtelt sein). Ich habe es mit dem Befehl versucht
:g/^ *subroutine \(.*\)/;/end subrout/s/end subroutine/& \1
Das ändert jede Zeile (ich habe es in der untersten Zeile gelesen) und ändert nichts, so wie der Puffer \1
leer ist. Der Befehl
:g/^ *subroutine \(.*\)/;/end subrout/s/end subroutine/& hello
funktioniert gut, ist aber offensichtlich nicht das, was ich will. Die Frage ist also: Wie kann ich in der Ersatzzeichenfolge ein Muster verwenden, das mit dem globalen ex-Befehl übereinstimmt :g
?
BEARBEITEN Ich bearbeite die Frage, da ich zum Zeitpunkt meiner Veröffentlichung die Antwort, die eine Antwort auf den konkreten Fall war, auf den ich mich bezog, eilig akzeptierte, aber nicht auf den Titel der Frage, der etwas allgemeiner ist.
Ich gehe auf den Punkt. Ich habe eine Datei wie die folgende (unsinnig, nur um sie so allgemein wie möglich zu gestalten):
# 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
(Tatsächlich sind die Zeilen, die jeder Zeile folgen, #
Hunderte.)
Ich muss in jeder Zeile nach jeder Zeile #
(und vor der folgenden Zeile) Ersetzungen vornehmen #
. Diese Ersetzungen sollten alle den Text nach der führenden #
Zeile (oder einem Teil davon) verwenden. Ein Beispiel für einen Wunsch, den ich erreichen möchte, ist
# 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
Beachten Sie, dass #
in den folgenden Zeilen nur das erste folgende Wort eingefügt wird.
Wie ich bereits sagte, möchte ich wissen, ob das Muster des :g
Befehls als Ersatzzeichenfolge verwendet werden kann. Ich bin so an dieser Antwort interessiert, da es sehr ärgerlich ist, ein Makro zu registrieren (ein falscher Tastendruck bedeutet, von vorne zu beginnen!), Während ein Befehl wie dieser
:g/^# \(\<\w\+\>\)/+;/^#/- s/\(\<\w\+\>\)\(.\+$\)/\2 \1 \3
es wäre perfekt! ... und es fällt mir schwer zu glauben, dass es keine Möglichkeit gibt, einen Befehl zu verwenden, der die Arbeit erledigt!
norm!
tötet%
ausmatchit
. Lösung ::%g/^\s*subroutine/norm ^whye^%$p
.