2010-04-07 50 views
6

Cách hiệu quả nhất để xóa văn bản 2010-04-07 14: 25: 50,773 DEBUG Đây là câu lệnh nhật ký gỡ lỗi - từ tệp nhật ký như trích xuất bên dưới bằng cách sử dụng Vim?Cách hiệu quả nhất để liên tục xóa văn bản hàng đầu bằng cách sử dụng Vim là gì?

 
2010-04-07 14:25:50,772 DEBUG This is a debug log statement - 9,8 
2010-04-07 14:25:50,772 DEBUG This is a debug log statement - 1,11 
2010-04-07 14:25:50,772 DEBUG This is a debug log statement - 5,2 
2010-04-07 14:25:50,772 DEBUG This is a debug log statement - 8,4 

Đây là những gì kết quả sẽ giống như thế:

 
9,8 
1,11 
5,2 
8,4 

Lưu ý rằng nhân dịp này tôi đang sử dụng gVim trên Windows, vì vậy xin đừng đề nghị bất kỳ chương trình UNIX mà có thể phù hợp hơn với nhiệm vụ — Tôi phải làm điều đó bằng cách sử dụng Vim.

Trả lời

13

Chạy lệnh: :%s/.* - //

Chỉnh sửa, giải thích:

%: whole file 
s: subsitute 
.* - : find any text followed by a space a dash and a space. 
// : replace it with the empty string. 
1

Cách dễ nhất có thể là sử dụng macro. Bấm qa để bắt đầu ghi âm trong sổ đăng ký a. Sau đó, loại bỏ các ký tự theo cách bạn đang sử dụng để trong Vim. Nhấn q để dừng quay. Sau đó, lấy số lượng dòng và nối thêm @a, ví dụ cho 4, nhấn [email protected]. Điều này sẽ lặp lại macro 4 lần.

2

Giải pháp của tôi sẽ là:

qa     [start recording in record buffer a] 
^ (possibly twice) [get to the beginning of the line] 
d3f-    [delete everything till - including] 
<del>    [delete the remaining space] 
<down>    [move to next line] 
q     [end recording] 
<at>a    [execute recorded command] 

Sau đó, chỉ cần giữ <at> cho đến khi bạn đang thực hiện và để tự động lặp lại chìa khóa làm công việc cho bạn.

Lưu ý:
Các macro đã ghi có thể không phải lúc nào cũng là công cụ nhanh nhất và hoàn hảo nhất cho công việc, thường dễ dàng hơn để ghi và thực thi macro.

+0

Nó phải là 'd3f-' vì tất cả mọi thứ cho đến dấu * * cuối cùng (3) sẽ bị xóa. Dù sao, giải pháp rất tốt. :-) –

+0

cảm ơn, bằng cách nào đó đã bỏ lỡ dấu gạch ngang trong ngày. bài đã sửa. – dbemerlin

0

Bạn có thể làm:

1,$s/.*- // 
  • 1: dòng 1
  • $: dòng cuối cùng
  • s: thay
  • .*: anything

Vì vậy, nó thay thế trên mỗi dòng bất cứ điều gì theo sau dấu gạch ngang và không gian với không có gì.

+0

Tôi sẽ thả 'g' vì bạn chỉ muốn thay thế xảy ra một lần trên mỗi dòng. –

+0

@Judge: YOu đúng. Cảm ơn :) – codaddict

6

Bạn cũng có thể sử dụng chế độ khối trực quan để chọn tất cả các ký tự mà bạn muốn xóa:

gg  Go to the beginning of the file 
Ctrl-v Enter visual block mode 
G   Go to the end of the file 
f-  Go to dash 
<right> Go one more to the right 
d   Delete the selected block 
+0

Không phải là Shift + V để vào chế độ chặn hình ảnh? Ngoài ra, nó cần phải khớp với dấu gạch ngang thứ ba, vì dấu thời gian chứa hai dấu gạch ngang. –

+0

Shift-v là chế độ đường trực quan. Ctrl-v thực sự là chế độ chặn hình ảnh. –

+0

'Shift + v' (là' V') được sử dụng để vào chế độ đường trực quan. – wRAR

0

:%s/.\{-}\ze\d\+,\d\+$//

Đó chỉ huy hoạt động bằng cách neo đậu để dấu phẩy tách số ở cuối dòng, do đó nó hoạt động ngay cả khi mọi thứ khác nhưng những con số trong chuỗi thay đổi.

Cách chặn hình ảnh có lẽ là giải pháp dễ nhất và giải pháp tôi muốn sử dụng.Tuy nhiên, nó không hoạt động nếu các dòng đã trở thành so le, như trong:

 
2010-04-07 14:25:50,772 DEBUG This is a debug log statement - 9,8 
2010-04-07 14:25:50,772 DEBUG This is another debug log statement - 9,8 

Các delimeter cũng có thể thay đổi để một nhân vật khác nhau do đó, một dòng sau đó sẽ như thế nào:

2010-04-07 14:25:50,772 DEBUG This is a debug log statement | 9,8

Sau đó, sử dụng :%s/.* - // sẽ không hoạt động.

Giải thích cho regex:

.\{-} trận đấu bất cứ điều gì, ngoại trừ dòng mới, càng ít càng tốt

\ze dừng phù hợp, do đó thay thế không ảnh hưởng đến các ký tự sau

\d\+,\d\+$ chữ số, tại ít nhất một, theo sau là dấu phẩy, tiếp theo là các chữ số, ít nhất một dấu phẩy, và cuối dòng

Tự nhiên nó không hoạt động nếu định dạng của mong muốn và Lues ở cuối của dòng là thất thường, trong trường hợp các giải pháp khác làm việc nếu các dòng lên đến các giá trị có cùng độ dài hoặc các dấu phân cách là như nhau.

Các vấn đề liên quan