Frage Vim: Wie lösche ich jede zweite Zeile?


Wie man es in Vim macht:

VOR:

aaa
bbb
ccc
ddd
eee
fff

NACH:

aaa
ccc
eee

74
2017-12-22 14:35


Ursprung


Antworten:


Sie können dafür ein Makro verwenden. Mach Folgendes.

  • Im Befehlsmodus starten.
  • Wechseln Sie zum Anfang der Datei, indem Sie drücken gg.
  • Drücken Sie qq.
  • Klicken Sie auf den Pfeil nach unten und drücken Sie dd nach.
  • Drücken Sie q.
  • Drücken Sie 10000@q

PS: Um in den Kommandomodus zu gelangen, drücken Sie mehrmals Esc.


87
2017-12-22 14:40



Ein eleganter (und effizienter) Weg, um die Aufgabe zu erfüllen, ist die Ausgabe der :+delete Befehl Entfernen der Zeile neben dem aktuellen, in jeder Zeile Verwendung der :global Befehl.

:g/^/+d

217
2017-12-01 03:20



Wir können benutzen :normal oder :norm um Befehle im normalen Modus auszuführen. Quelle.

:%norm jdd

55
2017-12-01 00:12



:map ^o ddj^o
^o

Hier steht für CTRL. Rekursives Makro, um alle zwei Zeilen eine Zeile zu löschen. Wähle deine erste Zeile und es ist fertig.


10
2017-12-22 17:25



von vim Mailarchiv:

:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile

(Um in einer Zeile der vim-Befehlszeile eingegeben zu werden, löscht Zeile 1,3,5,7, ...)


7
2017-12-22 14:40



Sie können immer einen Shell-Befehl pipen, was bedeutet, dass Sie jede beliebige Skriptsprache verwenden können:

:%!perl -nle 'print if $. % 2'

(oder verwenden Sie "unless" anstelle von "if", abhängig davon, welche Zeilen Sie möchten)


5
2017-12-22 14:50



:%!awk -- '++c\%2'

Alternative

:%!awk -- 'c++\%2'

je nachdem, welche Hälfte du aussortieren willst.


4
2017-12-22 15:00



Sie sollten in der Lage sein, ein Makro zu verwenden:

http://www.oreillynet.com/mac/blog/2006/07/more_vim_save_time_with_macros_1.html


3
2017-12-22 14:40



Als einen anderen Ansatz könnten Sie auch Python verwenden, wenn Ihr vim dies unterstützt.

:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]

b = cb[:] Kopiert vorübergehend alle Zeilen im aktuellen Puffer nach b. b[::2] holt jede zweite Zeile aus dem Puffer und weist sie dem gesamten aktuellen Puffer zu cb[:]. Die Kopie zu b Dies ist erforderlich, da Pufferobjekte die erweiterte Slice-Syntax nicht zu unterstützen scheinen.

Dies ist wahrscheinlich nicht der "vim way", aber könnte leichter zu merken sein, wenn Sie Python kennen.


3
2018-06-23 10:10



Sie können Vims eigene Such- und Ersatzfunktionen wie folgt verwenden: Setzen Sie den Cursor auf die erste Zeile und geben Sie den normalen Modus ein:

:.,/fff/s/\n.*\(\n.*\)/\1/g
  • Das .,/fff/ ist der Bereich für die Substitution. Es bedeutet "von dieser Linie zu der Linie, die der Regex entspricht fff (in diesem Fall die letzte Zeile).
  • s/// ist der Ersatzbefehl. Es sucht nach einer Regex und ersetzt jedes Vorkommen davon durch eine Zeichenfolge. Das g am Ende bedeutet, die Substitution zu wiederholen, solange die Regex weiterhin gefunden wird.
  • Die Regex \n.*\(\n.*\) passt eine neue Zeile, dann eine ganze Zeile (.* passt auf eine beliebige Anzahl von Zeichen, mit Ausnahme von Zeilenumbrüchen), gefolgt von einem weiteren Zeilenumbruch und einer anderen Zeile. Die Klammern \( und \) weil der Ausdruck in ihnen aufgezeichnet wird, damit wir ihn später verwenden können \1.
  • \1 fügt die gruppierte neue Zeile und die Zeile danach wieder ein, weil die nächste Zeile auch nicht gelöscht werden soll - wir wollen nur, dass der Ersetzungsmechanismus an ihr vorbeikommt, damit wir sie bei der nächsten Ersetzung nicht löschen.

Auf diese Weise können Sie den Bereich steuern, in dem der Löschvorgang stattfinden soll, und Sie müssen kein externes Tool verwenden.


2
2017-12-22 15:02



Um ungerade Zeilen zu löschen (1,3,5, ..) -> :%s/\(.*\)\n\(.*\)\n/\2\r/g

Um gerade Zeilen zu löschen (2,4,6, ..) -> :%s/\(.*\)\n.*\n/\1\r/g

Suche nach Text (bildet die erste Zeile) gefolgt von einem neuen Zeilenzeichen und etwas mehr Text (bildet die zweite Zeile) gefolgt von einem weiteren neuen Zeilenzeichen und ersetze das Obige durch entweder die erste Übereinstimmung (ungerade Zeile) oder die zweite Übereinstimmung (gerade Zeile) gefolgt von einem Wagenrücklauf.


1
2018-05-22 16:09