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?)

War es hilfreich?

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

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