Ich möchte ein einfaches Vim-Skript erstellen, das einfach n Zeilen löscht, 1 Zeile überspringt und bis zum Ende des Dokuments wiederholt. Ich kümmere mich nicht um bestimmte Übereinstimmungen, ich möchte nur die Zeile löschen. Zum Beispiel; Daher möchte ich den Befehl 3ddj
für das gesamte Dokument wiederholen .
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
So sieht es aus wie ...
Text I want to keep.
Text I want to keep.
Text I want to keep.
Vielen Dank.
regular-expression
normal-mode
repeated-commands
Max Copley
quelle
quelle
regular-expression
in Ihre Frage aufgenommen, aber die Frage scheint keinen Grund anzugeben, dies mit regulären Ausdrücken zu tun. Wenn Sie tatsächlich nach etwas suchen, das reguläre Ausdrücke verwendet, kann stackoverflow.com/questions/17735289/… von Interesse sein. Diese Frage betraf Notepad ++, aber die Antwort verwendet nur einen PCE-Regex. (Haftungsausschluss: Ich habe diese Antwort geschrieben.)Antworten:
Sehr einfacher Ansatz:
qa3ddjq
Schritt drei wiederholt das Makro tausendmal oder bis ein Fehler auftritt. Wenn Sie das Dateiende treffen (daher keine zu löschenden Zeilen), wird ein Fehler ausgegeben und die Wiederholung des Makros wird abgebrochen.
Siehe
:help recording
.quelle
q
(im Befehlsmodus und in vim oder anderen neueren alternativen Versionen [neovim usw.], jedoch nicht im Original vi) bedeutet "Aufnahme starten und in den Puffer" Nächster Buchstabe "legen". daher:qa
bedeutet "Aufnahme in den 'a'-Puffer starten". Anschließend werden alle danach eingegebenen Tasten (bis zur nächstenq
im Befehlsmodus) aufgezeichnet (Sie können sogar aufzeichnen: in den Bearbeitungsmodus wechseln, etwas eingeben, in den Befehlsmodus wechseln usw.). Dann12@a
würden alle Aktionen, die im Puffer "a" aufgezeichnet wurden, 12 Mal wiederholt.1000@q
am Ende ausführen möchten , können Sie außerdem ein rekursives Makro erstellen:qa3ddj@aq@a
Dies müssen Sie jedoch möglicherweiseqaq
zuerst tun , um sicherzustellen, dass der"a
Start leer ist.Die einfachste Lösung für mich wäre:
Das ist:
%
: für jede Zeilenorm
: Führen Sie die folgenden Tasten wie im normalen Modus ausj3dd
: gehe in die Zeile und lösche 3 ZeilenGehen Sie also von der ersten Zeile zur zweiten und löschen Sie die nächsten 3 Zeilen. Die zweite
Text I want to keep.
befindet sich jetzt in der zweiten Zeile. Gehen Sie eine Zeile nach unten, löschen Sie 3. Spülen und wiederholen.Hinweis: Wenn Sie nicht die gesamte Datei verarbeiten möchten, können Sie die
%norm
durch z. B. ersetzen5,$norm
, um von der 5. Zeile bis zum Ende der Datei zu verarbeiten.quelle
Sie haben bereits einige großartige Lösungen zur Verfügung. Hier ist noch einer:
Zuerst führen wir eine Aktion für jede Zeile aus (
:g
Übereinstimmung mit dem^
(Zeilenanfang)) und führen für jede Zeilennummer das Ergebnis von auslinenumber % 4
. Wenn das Ergebnis ungleich ist1
, fügen wirDELETE ME
am Anfang der Zeile hinzu und markieren die Zeilen, die mit dem nächsten Befehl gelöscht werden sollen.Der nächste Befehl ist ein regulärer (
:g
) Befehl, der allen Zeilen entspricht, die mit beginnen,DELETE ME
und dies tut.Hinweis: Sie können die Zeile nicht sofort mit dem ersten
:g
Befehl löschen , da dies die resultierende Modulo-Berechnung ändern würde. Daher müssen wir die Zeilen zuerst markieren und in einem zweiten Schritt löschen.quelle
Ich weiß, dass dies der
vi
Kanal ist, aber für mich ist das einsed
Problem.So können Sie es in eine
vi
Lösung verwandeln :quelle
Eine Alternative (ich nehme an, wir beginnen in Zeile 1 und löschen die Zeilen 2-4, 6-8 usw. gemäß einem Beispieltext):
Wenn Sie dies lieber interaktiv tun möchten, können Sie das "Befehlszeilenregister" verwenden. Das heißt, drücken Sie
:+1del 3<CR>
und dann1000@:
quelle
eine Alternative: Sie möchten alle Zeilen behalten: 1, 4 usw. Sie könnten verwenden:
Eine andere Alternative: Wenn Sie wissen, dass die gewünschten Linien mit einem eindeutigen Muster übereinstimmen:
quelle