Vi biên tập: Cách nhanh nhất để xóa nhiều hàng trong một tệp là gì?


12

Tôi muốn sử dụng trình soạn thảo Vi để xóa nhiều hàng trong một tệp. Xin vui lòng cho tôi ý tưởng hoặc đề nghị.

Mục tiêu của tôi là như thế này:

Trước:

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

Sau;

1
10
20
30
40
.
.

3
Làm thế nào để bạn chọn các hàng để xóa? Bạn có muốn rời khỏi một hàng cứ sau 10 hàng không?
matzeri

1
Bạn có thể xóa phạm vi của các dòng với :[range]dví dụ :3,5dxóa các dòng từ ba đến năm (bao gồm).
Bratchley

6
Ngoài ra còn có vi.stackexchange .
Alexey

@R Ketkaew - Bạn đang cố xóa danh sách các số hoặc chúng là hàng? Bạn có thể vui lòng cập nhật câu hỏi của bạn để làm rõ?
DarkHeart

Tôi biết bạn đang hỏi về Vi, nhưng bạn cũng có thể làm với GNU Sed:gsed -n '1p; 0~10p'
Shadowtalker 16/07/2016

Câu trả lời:


17

Nếu bạn có nghĩa là bạn muốn giữ mỗi dòng thứ 10 và xóa phần còn lại:

%norm 9ddj

Giải trình:

% toàn bộ tập tin

norm thực hiện các lệnh sau trong "chế độ bình thường"

9dd xóa 9 dòng

j di chuyển xuống một dòng (tức là giữ nó)

lưu ý: điều này xóa hàng đầu tiên.

Chuyển thể từ http://www.rayninfo.co.uk/vimtips.html


Hoặc sử dụng lệnh toàn cầu:

  • Nhân đôi dòng đầu tiên ggYP
  • :g/^/+ d9

Được chuyển thể từ /programming/1946738/vim-how-to-delete-every-second-row


Hoặc bạn có thể sử dụng awk:

%!awk 'NR \% 10 == 0 || NR == 1'

Lệnh awk làm việc cho tôi. Tôi luôn nghĩ awk yêu cầu tối thiểu một khối {...}. thật tốt khi biết bạn không. Đó là lệnh awk không tầm thường đầu tiên tôi đã làm việc!
the_velour_fog 16/07/2016

1
@the_velour_fog khối được yêu cầu. nếu bạn không viết một cái, AWK sẽ hành xử như thể bạn đã viết{ print $0 }
Shadowtalker 16/07/2016

@RKetkaew Bạn đã sử dụng tùy chọn nào? Nếu một câu trả lời giải quyết câu hỏi của bạn, xin vui lòng bấm vào đánh dấu để đánh dấu nó là câu trả lời.
gạch dưới

@underscore_d Xin chào, tôi đã sử dụng một lệnh được đề xuất từ ​​DarkHeart. Cảm ơn bạn đã bình luận của bạn.
rangsiman

12
:2,$v/0$/d

xóa các dòng không kết thúc 0bắt đầu từ dòng thứ hai.


2
Đây, đây là giải pháp thông minh. Tôi chỉ muốn thêm một lời giải thích rằng 2,$là phạm vi, và v/0$/dcác g!lệnh. Trường hợp 0$regex và dlệnh ex sẽ được chạy trên tất cả các dòng không khớp.
hóa học
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.