2016-04-06 16 views
2

Problem
Ich habe eine Datei, die wie folgt aussieht:vim: ersetzen Wort mit dem ersten Wort der Linie

Wort = etwas etwas aaa etwas aaa
word2 = etwas etwas aaa etwas aaa
word3 = etwas etwas aaa etwas aaa

Beachten Sie, dass die "etwas" nicht unbedingt das gleiche Wort überall sind. Auch "etwas" und "aaa" sind nicht unbedingt durch Leerzeichen getrennt.

Frage
Ich möchte alle Vorkommen von „aaa“ mit dem ersten Wort der Linie innerhalb Vim ersetzen. Die Ausgabe sollte wie folgt aussehen:

Wort = etwas etwas Wort etwas Wort
word2 = etwas etwas word2 etwas word2
word3 = etwas etwas word3 etwas word3

Bisher habe ich hauptsächlich in ausgesehen haben die Such- und Ersetzungs-Syntax von vim, weil mir das am besten vertraut ist.

Vielen Dank für Ihre Hilfe!

Antwort

2

Für eine Lösung vollständig mit regex, schlage ich folgendes:

:%s/\v%(^([^=]+).*)@<=aaa/\1/g 

Dies funktioniert mit einem Blick hinter (\@<=), die eine Breite von Null hat . Die \v um der Start der Regex ist nur um die Flucht zu erleichtern, indem "sehr Magic" -Modus (siehe :h \v). Der Ausdruck selbst:

%(^([^=]+).*)@<=aaa 

Der Look hinter arbeitet mit der ersten Gruppe. Das %() Formular ist eine nicht Erfassungsgruppe (ein bisschen schneller und zählt nicht als eine nummerierte Eins in der Ersetzung). Die innere Gruppe erfasst alles, was kein Gleichheitszeichen ist, und nach dieser Gruppe wird alles angepasst (.*). All dies wird nicht gezählt in der Regex, was wirklich übereinstimmt ist die aaa, aber es ist nur abgestimmt, wenn diese Bedingungen vorausgehen. Natürlich geht es ihnen vorangestellt , aber das Ziel ist es, das erste Wort zu erfassen.

Diese aaa wird dann von der erfassten Gruppe, mehrere Male in eine Leitung (g Flag) und in allen Leitungen (% Bereich) ersetzt.

2

Dieser :s Befehl funktioniert für Ihr Beispiel:

%s/\<aaa\>/\=substitute(getline('.'),'^[^=]*\zs=.*','','')/g 
+1

Interessante Idee, aber ich denke, Sie können es einfacher machen, indem Sie '\ = matchstr (getline ('.'), '^ [^ =] *')' Anstelle von 'substituent()' verwenden – sidyll

Verwandte Themen