Mit VIM ersetzen, einen Teil des Suchmusters wiederverwenden

29

Ich arbeite mit VImund versuche, einen Befehl zum Suchen und Ersetzen einzurichten, um einige Ersetzungen vorzunehmen, bei denen ich den regulären Ausdruck wiederverwenden kann, der Teil meiner Suchzeichenfolge ist.

Ein einfaches Beispiel wäre eine Linie , wo ich ersetzen wollen (10)zu {10}, wobei 10 eine beliebige Zahl sein kann.

Ich bin so weit gekommen

  .s/([0-9]*)/what here??/

das passt genau zu dem Teil, den ich will.

Nun den Ersatz habe ich ausprobiert

  .s/([0-9]*)/{\0}/

Dies ergibt jedoch eine Ausgabe {(10)}

Dann habe ich es versucht

 .s/(\zs[0-9]*\ze)/{\0}/

Das hat mir aber gegeben ({10}), was ich auch schließe, aber nicht was ich will.

Ich glaube, ich brauche stattdessen eine andere Art von Markierung / Rückverweis \0, aber ich weiß nicht, wo ich suchen soll. Die Frage ist also, ob und wie dies in vim gemacht werden kann.

Bernhard
quelle

Antworten:

37

\0ist das ganze Spiel. Um nur einen Teil davon zu verwenden, müssen Sie es so einstellen und \ 1 verwenden

.s/(\([0-9]*\))/{\1}/

Eine ausführlichere Anleitung finden Sie hier oder in der vim Hilfe.

eilen
quelle
Beachten Sie, dass die Klammern für das Capture mit einem Backslash versehen sind.
Randall
0

Ich habe kürzlich einen älteren Code geerbt und wollte alle Vorkommen ersetzen wie:

print "xx"
print x,y
print 'xx'

zu

logging.info("xy") 

oder

logging.info(x,y)

Aufbauend auf der vorherigen Antwort und in der Hoffnung, dass jemand davon profitiert, habe ich den folgenden Befehl verwendet, der alle Vorkommen ändert:

%s/print\( .*\)/logging.info\(\1\)/g

Wenn Sie ersetzen %mit .und entfernen Sie /gwerden Sie am Ende mit

.s/print\( .*\)/logging.info\(\1\)

Auf diese Weise können Sie jedes Spiel durchgehen und auswählen, ob Sie es ändern möchten oder nicht.

yagad
quelle
0

Eine bessere Möglichkeit, die einzelnen Übereinstimmungen zu überprüfen, besteht darin, ein "c" am Ende des Codes einzufügen, anstatt zeilenweise vorzugehen

%s/print\( .*\)/logging.info\(\1\)/gc
Tim Rosenow
quelle
Dies beantwortet die ursprüngliche Frage in keiner Weise
Bernhard