Frage

Unter der Annahme, die folgende Textdatei, die eigentlich eine Datendump von Geldern und Preisstatistik ist:

PBCPDF
05/01/2006
 0.0000
 0.0000
PBCPDF
 0.0000
06/01/2006
 0.0000
 0.0000
PBCPDF
 0.0082
[… lines repeat …]

Was ich erreichen wollte, ist alle Instanzen PBCPDF mit Ausnahme des ersten zu löschen, die ich den Ersatz-Befehl als :.+1,$s/PBCPDF\n//g schreiben konnte.

Da ich aber ein Makro programmieren wollte mehrere Fondsnamen zu verarbeiten, muss ich ein Mittel, eine Art Muster verwenden, die die aktuelle Zeile als Suchmuster abrufen würde, ohne dass ich es von Hand zu tun.

Gibt es eine Möglichkeit, das zu tun?

War es hilfreich?

Lösung

Wenn Sie tun dies in einem Makro (mit dem Befehl q) es ist klug genug, um zu fangen, wenn Sie einige der eher esoterischen Tastendruck Befehle zu tun - das, was ich über speziell zu denken habe, ist STRG + R, STRG + W , der das Wort unter dem Cursor in die Befehlszeile einzufügen. So zum Beispiel, wenn Sie getan haben

ESC
qw
/[CTRL-R, CTRL-W] (you should see the word under the cursor enter the command line)
[enter]
q

dann erstellt man nur einen Makro, das für das nächste Wort in dem Puffer sucht, die gleich wie diese ist, es bekommen? Es wird dynamisch das Wort unter dem Cursor in den Befehl als Teil des Makros zerren. Es könnte so etwas wie CTRL-W in dem Befehl sein oben, dass dies tut für die ganze Linie, aber ich weiß nicht, es Stegreif.

Andere Tipps

ggyy:+1,$s/<Ctrl-R>"<BS>//g

Lassen Sie uns sehen, was das tut, genau.

auf die erste Zeile gehen

gg

Yank die gesamte liine

yy

die Substitution starten

:+1,$s/

Erhalten Sie die aktuelle Zeile aus dem Register zu dem Sie zerrte es an:

<Ctrl-R>"

Hinweis: Geben Sie nicht die“, Sie haben tatsächlich Steuerung und drücken Sie R, gefolgt von einem doppelten Anführungszeichen halten

.

Löschen Sie das Ende der Zeile Zeichen:

<BS>

. Hinweis: Drücken Sie die Rücktaste

Ersetzen Sie

mit nichts.

//g

Sie können dies in einem Makro aufzeichnen, indem sie mit einem qq / q Einwickeln oder was auch immer.

Nach dem Studium sykora ist und Matts Antworten, kam ich mit einer etwas besseren Verbesserung auf, die auf einer zeilenweisen Basis arbeitet eher als eine wortweise Basis (gemäß Matts Lösung ).

ist dieser Befehl ausgeführt wird, nachdem der Cursor auf die Zeile, von denen die Deletion positioniert ist, auftreten:

:.+1,$s/<CTRL-R>=getline(".")<CR>\n//g

Erklärung für VIM Anfänger:

:.+1,$s/

Substitution von der Leitung Start nach der aktuellen Zeile (.+1) und dem End-of-Datei ($)

<CTRL-R>=getline(".")<CR>\n

<CTRL-R> bezieht sich auf die tatsächliche der CTRL-und R-Tasten drücken, die spezielle Ausdrücke eingeben. In diesem Fall =getline(".") die den Text der aktuellen Zeile abruft.

<CR> bezieht sich auf das Drücken der Enter-Taste, die den <CTRL-R> Ausdruck abgeschlossen ist. Ich auch angeben, die Newline-Zeichen (\n) am Ende des Suchmusters, wie ich es entfernen müssen.

//g

Und dann mit nichts ersetzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top