Vi-Editor: Was ist der schnellste Weg, um mehrere Zeilen in einer Datei zu löschen?

12

Ich möchte den Vi-Editor verwenden, um mehrere Zeilen in einer Datei zu löschen. Bitte geben Sie mir eine Idee oder einen Vorschlag.

Mein Ziel ist wie folgt:

Vor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.
.
29
30
.
.

Nach;

1
10
20
30
40
.
.
Rangangsiman
quelle
3
Wie haben Sie die zu löschenden Zeilen ausgewählt? Möchten Sie alle 10 eine Reihe verlassen?
Matzeri
1
Sie können Zeilenbereiche löschen, indem Sie :[range]dbeispielsweise die :3,5dZeilen drei bis fünf (einschließlich) löschen .
Bratchley
6
Es gibt auch vi.stackexchange .
Alexey
@R Ketkaew - Versuchen Sie, eine Liste von Zahlen zu entfernen, oder handelt es sich um Zeilen? Könnten Sie bitte Ihre Frage aktualisieren, um dies zu klären?
DarkHeart
Ich weiß, dass Sie nach Vi fragen, aber Sie können auch mit GNU Sed tun:gsed -n '1p; 0~10p'
Shadowtalker

Antworten:

17

Wenn Sie meinen, Sie möchten jede 10. Zeile behalten und den Rest löschen:

%norm 9ddj

Erläuterung:

% ganze Datei

norm Führen Sie die folgenden Befehle im "normalen Modus" aus.

9dd 9 Zeilen löschen

j eine Zeile nach unten gehen (dh behalten)

Hinweis: Dadurch wird die erste Zeile gelöscht.

Angepasst von http://www.rayninfo.co.uk/vimtips.html


Oder mit dem globalen Befehl:

  • Dupliziere die erste Zeile ggYP
  • :g/^/+ d9

Angepasst von /programming/1946738/vim-how-to-delete-every-second-row


Oder Sie könnten verwenden awk:

%!awk 'NR \% 10 == 0 || NR == 1'
Dunkles Herz
quelle
Der Befehl awk funktioniert bei mir. Ich dachte immer, awk brauche mindestens einen Block {...}. Gut zu wissen, dass du es nicht tust. Es ist der erste nicht triviale awk-Befehl, an dem ich arbeite!
the_velour_fog
1
@the_velour_fog der Block ist erforderlich. Wenn Sie keine schreiben, verhält sich AWK so, als hätten Sie geschrieben{ print $0 }
Shadowtalker
@RKetkaew Welche der Optionen haben Sie verwendet? Wenn eine Antwort Ihre Frage löst, klicken Sie bitte auf das Häkchen, um sie als Antwort zu markieren.
underscore_d
@underscore_d Hallo, ich habe einen von DarkHeart vorgeschlagenen Befehl verwendet. Vielen Dank für Ihre Kommentare.
Rangsiman
12
:2,$v/0$/d

löscht die Zeilen, die nicht mit 0der zweiten beginnen.

Stéphane Chazelas
quelle
2
Dies ist die clevere Lösung. Ich möchte nur eine Erklärung hinzufügen, 2,$die den Bereich und v/0$/dden g!Befehl darstellt. Wo 0$ist der reguläre Ausdruck und dder ex-Befehl, die in allen Zeilen ausgeführt werden, die nicht übereinstimmen?
gro♀