2013-07-02 35 views
8

Tôi biết rằng, trong vim, tôi có thể sắp xếp một tập tin bằng cách sử dụng biểu thức chính quy để chỉ ra các bộ phận của mỗi hàng Tôi muốn sử dụng để xem xét trong khi sắp xếp sử dụng:Vim: loại sử dụng nhiều mô hình

:sort 'regex' r 

Is nó có thể kết hợp nhiều hơn một biểu thức?

Ở đây bạn có một ví dụ:

INPUT:

bar a 2 
foo b 1 
bar b 1 
foo a 2 

: loại '[az]' r

foo b 1 
bar b 1 
bar a 2 
foo a 2 

loại '[0-9]' r

bar a 2 
bar b 1 
foo b 1 
foo a 2 

EXPECTED (có thể là một cái gì đó "như": sắp xếp '[AZ] | [0-9]' r):

bar b 1 
bar a 2 
foo b 1 
foo a 2 

Xin lưu ý rằng "loại" trọc không hoạt động, do những "a" và "b" mà phá vỡ các chữ số đặt hàng

bar a 2 
bar b 1 
foo a 2 
foo b 1 
?

Một VIM thay thế bên ngoài cũng được chấp nhận, nhưng, vì lợi ích của sự tò mò, tôi muốn biết nếu nó thực sự có thể làm điều đó trong vòng VIM (và nếu afermative, làm thế nào ;-)

Rất cám ơn, Trân

+0

Kết quả của 'sắp xếp '[0-9]' r' không được dán chính xác. Kết quả sẽ khác nhau. – Birei

+0

@ Birei: Bạn nói đúng. Chỉ cần sửa nó. Cảm ơn! –

Trả lời

6

Giả sử rằng bạn có loại bên ngoài có sẵn, sau đây nên làm việc:

:%!sort -k1,1 -k3,3n 

EDIT: Giải thích:

-k được sử dụng để xác định phím phân loại. -k1,1 ngụ ý bắt đầu sắp xếp trên key1 và kết thúc nó key1. -k3,3n ngụ ý bắt đầu sắp xếp trên key3 và kết thúc nó key3; n ở đây biểu thị loại số, tức là so sánh theo giá trị số chuỗi.

Theo mặc định, sắp xếp giả định chuyển tiếp trống sang không trống làm dấu tách trường. Như vậy, nó sẽ xem xét dòng bar b 1 để bao gồm ba trường. Nếu các giá trị được giới hạn bởi một ký tự cụ thể khác với khoảng trắng, hãy nói :, bạn sẽ chỉ định trình tách trường bằng cách thêm -t:.

+0

Phải, hoạt động! Tuy nhiên, bạn có thể giải thích ý nghĩa của các tham số, vì vậy tôi có thể dễ dàng mở rộng nó đến các tình huống khác nhau (thực tế, đây là một ví dụ đơn giản) không? –

+0

@CarlesSala xem giải thích ở trên. – devnull

+0

Hoàn hảo, điều đó đã làm được điều đó! Cảm ơn! –

2

Có một lỗ hổng trong những gì bạn đang yêu cầu ... Nếu bạn muốn sắp xếp theo từ đầu tiên VÀ số, thì bạn cần phải bằng cách nào đó xác định thứ tự ưu tiên. Nói cách khác, bạn có muốn danh sách được sắp xếp trông như thế này:

bar b 1 
bar a 2 
foo b 1 
foo a 2 

hay, đây:

bar b 1 
foo b 1 
bar a 2 
foo a 2 

Rõ ràng, câu trả lời là người đầu tiên. Nhưng bạn cần phải nói với vim đó! Do đó, tôi không thể nghĩ ra cách nào (hợp lý) để làm điều đó trong một mệnh lệnh ... Nhưng, tôi có thể làm điều đó trong hai:

:sort /\d/ r 
:sort /[a-z]/ r 

Bằng cách làm như các lệnh theo thứ tự này, bạn đang xác định rằng từ đầu tiên được ưu tiên so với số.

+0

Tôi không thấy lỗ hổng ... Nhu cầu đặt hàng cho yêu cầu như vậy là hiển nhiên, và mặc dù tôi không chỉ định rõ ràng thứ tự tôi đã làm nó một cách rõ ràng (tôi đã nói muốn sử dụng hai quy tắc, được đề xuất '[az ] | [0-9] ', dán kết quả ...). Dù sao, bạn có phiền khi khám phá lý do khiến đề xuất của bạn hoạt động không? Các/\ d/và/[a-z]/thực sự đang làm gì? –

+0

\ d tương đương với [0-9]. /.../ tương đương với việc nhập '...', trong ngữ cảnh này. Cú pháp của tôi có lẽ là cách "chuẩn hóa" hơn để thực hiện việc này, nhưng không có gì sai với bạn. Nó có nghĩa là điều tương tự. Bạn cũng có thể chỉ cần gõ: sor, thay vì: sắp xếp, nếu bạn muốn lưu thêm phím tắt - nhưng tôi không bận tâm bạn với điều đó! Lỗ hổng là lệnh: sort tìm kiếm ** mẫu ** trong mỗi dòng, sau đó sắp xếp lại các hàng dựa trên mẫu đó. Bạn đang tìm hai mô hình khác nhau, nằm ngoài phạm vi của lệnh (tôi nghĩ. Theo như tôi có thể nói.) –

+0

Nhưng ngoài ra, vấn đề là, bạn sẽ nói vim để sắp xếp cột 1 trên cột 3 như thế nào và bỏ qua cột 2? Tôi khá chắc chắn rằng thậm chí không thể ... và tại sao bận tâm, khi bạn chỉ có thể làm điều đó trong 2 lệnh đơn giản? –

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