Ersetzen von Text aus Zeile oben in Vim
Frage
Wie kann ich ersetzen die ersten zehn Zeichen einer Zeile, wo diese zehn Zeichen mit den ersten zehn Zeichen aus der Zeile über ein bestimmtes Muster entsprechen?
Edit: Es war nicht klar, ob ich die ersten zehn Zeichen zu ersetzen, wurde gefragt, wo das Spiel irgendwo in der Zeile erscheinen könnte, vielleicht eine Notiz in Ihrer Antwort machen, wenn es mit diesem Fall befasst (nennen wir diesen Fall B und die beabsichtigte ein Fall A?)
Lösung
Prehaps:
:%s/^\(.\{10}\)\(.*\n\)abcdefghij\(.*\)/\1\2\1\3/
Wo abcdefghij 'ist die 10 Zeichenkette in der 2. Zeile
Andere Tipps
So etwas wie dies funktionieren würde:
%s/^.\{10\}/\=strpart(get(getbufline("", line(".")-1), 0, ""), 0, 10)/
Dabei gilt ^.\{10\}
Ihre tatsächliche Muster ist.
%s/ # substitute all lines matching…
^.\{10\} # your pattern
/ # …with…
\= # an expression:
strpart( # gets the part of a string
get( # gets an element of a list
getbufline( # gets a list of lines from the current buffer
"", line(".")-1) # getbufline() the line before the current line
, 0, "") # get() first line in buffer, default to ""
, 0, 10) # strpart() first ten characters
/ # …end of substitution
:2,$g/<pattern>/s/^.\{10}/\=strpart(getline(line(".")-1),0,10)
-
2,$
ist unser Angebot (wie die erste Zeile hat keine vorherige Zeile) -
g//
können Sie einen Befehl auf Leitungen ausführen, die einem bestimmten Muster entsprechen. -
s/^.\{10}/
werden die ersten 10 Zeichen einer Zeile ersetzen
-
\=
können Sie in einem:s//
das Ergebnis einer vim Ausdruck ersetzen
-
line(".")
ist die aktuelle Zeilennummer -
getline(line(".")-1)
ist der Text der vorherigen Zeile -
strpart(getline(line(".")-1),0,10)
sind die ersten 10 Zeichen der vorherigen Zeile
Zum Beispiel 2,$g/frog/s/^.\{10}/\=strpart(getline(line(".")-1),0,10)
wird sich ändern:
I like eating mangos before frying frogs legs I wish I had a puppy She gave Dad a frog
Um dies zu:
I like eating mangos I like eating frogs legs I wish I had a puppy I wish I had a frog
Wenn ich eine komplexe Aktion wie, dass ich in der Regel ein Makro mit dem q
Befehl aufzeichnen. So etwas wie (nicht getestet):
/<pattern>
qq
10x
k
10yl
j
P
n
q
Und dann repeatedy Problem, das Makro als @q
optional mit einer Zählung vorangestellt.
Sie können Suchen und Ersetzen:
:7,9 s/foo/bar/c
Dieses Beispiel sucht von der Linie 7 bis 9 für jedes Auftreten von ‚foo‘, und ersetzt sie durch ‚Bar‘, auf jedem Treffer für ein bestätigen zu fragen. Wenn Sie nicht bestätigen wollen, fällt die c am Ende. Wählen Sie den Bereich, wie Sie sehen, passen und diese sollten Sie, wo Sie wollen
nur Bewegungen des vim und yanking / Einfügen .. Aufgrund der Dateiinhalte von ..
1234567890abcdef
qwertyuiopasdfgh
Mit dem Cursor auf q, 10x
, Datei wird:
1234567890abcdef
asdfgh
Bewegen Sie den Cursor auf die erste Zeile (mit k
wird es tun), dann tun 10yl
(yank 10 Zeichen, rechts)
Dann bewegen sich wieder eine Zeile, j
und Einfügen P
(Großbuchstaben, unter dem Cursor eingefügt werden), und die Datei wird zu:
1234567890abcdef
1234567890asdfgh
Kurz gesagt, mit dem Cursor auf q Start:
10xk10yljP
.. welche könnten Sie fügen in oder weisen zu einem Makro
Es wäre kürzer sein, wenn es eine offensichtliche Verknüpfung durch Überschreiben, einzufügen ist, aber ich konnte so etwas nicht finden
Eine andere Möglichkeit ist ein unglaublich dunkel suchen Regex Suchen / Ersetzen ..
Visuelle-line wählen Sie die zwei Ziellinien, und führen Sie die folgende Suche-und-Ersetzen-:
:'<,'>s/\(\(.\{10\}\).*\)\n\(.\{10\}\)\(.*\)$/\1\r\2\4/
Im Grunde ist es packt ..
-
\1
- die gesamte erste Zeile -
\2
- die ersten 10 Zeichen (in einer verschachtelten Gruppe) - ein Zeilenumbruch
-
\3
- die ersten zehn Zeichen der Zeile zwei -
\4
- der Rest der zweiten Zeile
Dann baut es die beiden Linien als \1\n\2\4
- komplette erste Zeile, Zeilenumbruch, die ersten 10 Zeichen des ersten, zweiten Restes