Erste Text, der auf einer anderen Leitung ist mit seiner Ex in Vim
Frage
Lassen Sie uns sagen, dass ich den folgenden Text in Vim haben:
file1.txt
file2.txt
file3.txt
renamed1.txt
renamed2.txt
renamed3.txt
Ich möchte eine Transformation wie folgt:
file1.txt renamed1.txt
file2.txt renamed2.txt
file3.txt renamed3.txt
Was ich im Sinne habe, so etwas wie die folgenden Ergebnisse:
:1,3 s/$/ <the text that is 4 lines below this line>
Ich bin stecken mit, wie der <the text that is 4 lines below this line>
Teil angeben.
Ich habe so etwas wie .+4
versucht (4 Zeilen unter der aktuellen Zeile), aber ohne Erfolg.
Lösung
Sie können es mit blockartiger Schnitt tun & paste.
1) Einlegeraum am Beginn jeder „umbenannt“ -Linie, z.B. :5,7s/^/ /
2) Verwendung blockartig visuelle Auswahl (ctrl-v
) alle „Datei“ die Linien zu wählen, und drücken Sie d
sie löschen
3) Verwendung blockweise wieder visuelle Auswahl das Leerzeichen am Anfang aller umbenannten Linien zu wählen, und drücken Sie p
. Dadurch wird die entsprechende Zeile aus dem Block einfügen Sie zu Beginn jeder Zeile gelöscht.
Andere Tipps
:1,3:s/\ze\n\%(.*\n\)\{3}\(.*\)/ \1
erklärt:
\ze - end of replaced part of match - the string matched by the rest of the pattern will not be consumed
\n - end of current line
\%(.*\n\)\{3} - next 3 lines
\(.*\) - content of 4th line from here
Damit werden die späteren Linien lassen, wo sie sind.
Ich würde ein Makro für das wirklich machen. Löschen Sie die untere Linie, nach oben, einfügen, J
oin Linien, dann führen Sie das Makro auf die anderen. Die andere Methode, die ich denke, angemessen wäre, ist ein separates Skript als Filter zu wirken.