Editor Vi: Apa cara tercepat untuk menghapus beberapa baris dalam suatu file?

12

Saya ingin menggunakan editor Vi untuk menghapus beberapa baris dalam sebuah file. Tolong beri saya ide atau saran.

Tujuan saya adalah seperti ini:

Sebelum:

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

Setelah;

1
10
20
30
40
.
.
rangsiman
sumber
3
bagaimana Anda memilih baris untuk dihapus? Apakah Anda ingin meninggalkan satu baris setiap 10?
matzeri
1
Anda dapat menghapus rentang garis dengan :[range]dmisalnya :3,5dmenghapus baris tiga hingga lima (secara inklusif).
Bratchley
6
Ada juga vi.stackexchange .
Alexey
@R Ketkaew - Apakah Anda mencoba menghapus daftar angka atau apakah itu baris? Bisakah Anda memperbarui pertanyaan Anda untuk menjelaskan?
DarkHeart
Saya tahu Anda bertanya tentang Vi, tetapi Anda juga dapat melakukannya dengan GNU Sed:gsed -n '1p; 0~10p'
shadowtalker

Jawaban:

17

Jika Anda bermaksud mempertahankan setiap baris ke-10 dan menghapus sisanya:

%norm 9ddj

Penjelasan:

% seluruh file

norm jalankan perintah berikut dalam "mode normal"

9dd hapus 9 baris

j bergerak ke bawah satu baris (yaitu simpan)

Catatan: ini menghapus baris pertama.

Diadaptasi dari http://www.rayninfo.co.uk/vimtips.html


Atau menggunakan perintah global:

  • Gandakan baris pertama ggYP
  • :g/^/+ d9

Diadaptasi dari /programming/1946738/vim-how-to-delete-every-second-row


Atau Anda bisa menggunakan awk:

%!awk 'NR \% 10 == 0 || NR == 1'
Hati gelap
sumber
Perintah awk bekerja untuk saya. Saya selalu berpikir awk membutuhkan minimal satu blok {...}. senang tahu kamu tidak. Ini adalah perintah awk non-sepele pertama yang saya dapatkan!
the_velour_fog
1
@the_velour_fog blok yang diperlukan. jika Anda tidak menulis satu, AWK akan berperilaku seolah-olah Anda telah menulis{ print $0 }
shadowtalker
@RKetkaew Manakah dari opsi yang Anda gunakan? Jika suatu jawaban menyelesaikan pertanyaan Anda, silakan klik tanda centang untuk menandainya sebagai jawaban.
underscore_d
@underscore_d Hai, saya menggunakan perintah yang disarankan dari DarkHeart. Terima kasih atas komentar anda
rangsiman
12
:2,$v/0$/d

menghapus garis yang tidak berakhir di 0mulai dari yang kedua.

Stéphane Chazelas
sumber
2
Ini, ini adalah solusi cerdas. Aku baru saja menambahkan penjelasan yang 2,$merupakan jangkauan, dan v/0$/dyang g!perintah. Di mana 0$regex dan dperintah ex yang akan dijalankan pada semua baris yang tidak cocok.
grochmal