Wie es in Vim geht:
VOR:
aaa
bbb
ccc
ddd
eee
fff
NACH DEM:
aaa
ccc
eee
Wie es in Vim geht:
VOR:
aaa
bbb
ccc
ddd
eee
fff
NACH DEM:
aaa
ccc
eee
Antworten:
Sie können hierfür ein Makro verwenden. Mach Folgendes.
gg.qq.dddanach.q.10000@qPS: Um in den Befehlsmodus zu wechseln, drücken Sie einfach einige Male die Esc-Taste.
:g/^/+d vom Benutzer stackoverflow.com/users/254635/ib ( unten ) ist eine elegantere Möglichkeit, dies zu lösen.
Eine elegante (und effiziente) Möglichkeit, die Aufgabe auszuführen, besteht darin, den :+deleteBefehl aufzurufen und die Zeile nach der aktuellen Zeile in jeder Zeile mit dem folgenden Befehl zu entfernen :global:
:g/^/+d
:1d|g/^/+dlöscht die ungeraden Zeilen.
Wir können gegebene Befehle im normalen Modus verwenden :normaloder :normausführen. Quelle.
:%norm jdd
%norm ddjes nicht funktioniert, wenn Sie ungerade Zeilen löschen möchten.
:map ^o ddj^o
^o
Hier steht ^ für STRG. Rekursives Makro zum Löschen einer Zeile alle zwei Zeilen. Wählen Sie gut Ihre erste Zeile und es ist geschafft.
aus dem vim mail archiv :
:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile
(Wenn Sie in einer Zeile der vim-Befehlszeile eingeben, wird die Zeile 1,3,5,7, ... gelöscht.)
!perl -ne 'print unless $. % 2':-)
if (expression)der auch für jede dritte Zeile usw. funktioniert
Sie können jederzeit einen Shell-Befehl durchlaufen, dh Sie können eine beliebige Skriptsprache verwenden:
:%!perl -nle 'print if $. % 2'
(oder verwenden Sie "es sei denn" anstelle von "wenn", je nachdem, welche Zeilen Sie möchten)
-lWechsel zu Perl nicht ... außerdem würde ich sagen, dass dies awketwas weiter verbreitet ist als Perl, obwohl es heutzutage nicht mehr so viel ist und dies kürzer machen kann: :%!awk NR\%2oder :%!awk 1-NR\%2für die anderen Zeilen.
:%!awk -- '++c\%2'
Alternative
:%!awk -- 'c++\%2'
je nachdem welche hälfte du aussortieren willst.
NRVariable verwenden?
:%!awk NR\%2oder :%!awk 1-NR\%2, wie ich in einem anderen Kommentar gepostet habe. Das geht kaum noch.
1-NRist länger als c++. Ja, ich weiß, dass es ein Charakter ist. Wie ich schon sagte - der wahre Grund ist, dass ich es vergessen habe. Wie auch immer, es sieht so aus, als würden die Leute die Schönheit von awk hier nicht schätzen.
NRist kürzer als ++c:)
Sie können die eigenen Such- und Ersatzfunktionen von Vim wie folgt verwenden: Setzen Sie den Cursor in die erste Zeile und geben Sie im normalen Modus Folgendes ein:
:.,/fff/s/\n.*\(\n.*\)/\1/g
.,/fff/ist der Bereich für die Substitution. Es bedeutet "von dieser Zeile zu der Zeile, die dem regulären Ausdruck entspricht fff(in diesem Fall die letzte Zeile).s///ist der Ersatzbefehl. Es sucht nach einem regulären Ausdruck und ersetzt jedes Vorkommen durch einen String. Das gam Ende bedeutet, die Ersetzung zu wiederholen, solange der reguläre Ausdruck gefunden wird.\n.*\(\n.*\)reguläre Ausdruck entspricht einer neuen Zeile, dann einer ganzen Zeile ( .*entspricht einer beliebigen Anzahl von Zeichen mit Ausnahme einer neuen Zeile), dann einer weiteren neuen Zeile und einer weiteren Zeile. Die Klammern \(und \)bewirken, dass 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, da wir nicht möchten, dass auch die nächste Zeile weg ist. Wir möchten nur, dass der Substitutionsmechanismus daran vorbeigeht, damit wir sie beim nächsten Ersetzen nicht löschen.Auf diese Weise können Sie den Bereich steuern, in dem das Löschen erfolgen soll, und Sie müssen kein externes Tool verwenden.
$stattdessen /fff/für das Dateiende, unabhängig vom Inhalt der Datei.
Als weiteren Ansatz können 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[:]. Das Kopieren nach bist erforderlich, da Pufferobjekte die erweiterte Slice-Syntax nicht zu unterstützen scheinen.
Dies ist wahrscheinlich nicht der "vim Weg", könnte aber leichter zu merken sein, wenn Sie Python kennen.
So löschen Sie ungerade Zeilen (1,3,5, ..) -> :%s/\(.*\)\n\(.*\)\n/\2\r/g
Gerade Zeilen löschen (2,4,6, ..) -> :%s/\(.*\)\n.*\n/\1\r/g
Suchen Sie 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 ersetzen Sie das obige durch entweder erste Übereinstimmung (ungerade Zeile) oder zweite Übereinstimmung (gerade Zeile). gefolgt von Wagenrücklauf.
Sie können dies in vim versuchen
:1,$-1g/^/+1d
Ich werde versuchen, klarer zu sein (zwei Teile)
erster Teil der Auswahlbereich ( :from,to)
zweiter Teil die Aktion ( dlöschen)
:1,$-1 )g) delete ( +1d) nächste ZeileSie können versuchen, in die erste Zeile Ihrer Datei zu wechseln und diese auszuführen. :+1dDie nächste Zeile wird ausgeblendet
Ich weiß, dass es schlammig ist, aber es ist vim und es funktioniert