2010-04-29 11 views

Trả lời

24

Chỉ cần tìm thấy giải pháp here. Regex sau hoạt động chính xác:

g/^\(.*\)$\n\1$/d 
15
:%!uniq 

nếu bạn đang ở trên một hệ thống unix, hoặc một hệ thống mà có chương trình uniq

+0

Gợi ý tốt, tôi có nên nói trong câu hỏi tôi đang ở trên Windows (và không có Cygwin). – dukedave

2

Nếu bạn chỉ muốn loại bỏ tiếp giáp dòng trùng lặp, chỉ cần sử dụng uniq mà không sắp xếp bất cứ điều gì.

:%!uniq 
9

Nếu bạn muốn loại bỏ các bản sao không tiếp giáp bạn có thể sử dụng

:g/^\(.*\)\ze\n\%(.*\n\)*\1$/d 

(mà sẽ loại bỏ tất cả nhưng bản sao cuối cùng của một dòng)

mà sẽ thay đổi

Foo 
Bar 
Foo 
Bar 
Foo 
Baz 
Foo 
Quux 

đến

Bar 
Baz 
Foo 
Quux 

Nếu bạn muốn loại bỏ tất cả nhưng bản sao đầu tiên, hãy thử

:g/^/m0 
:g/^\(.*\)\ze\n\%(.*\n\)*\1$/d 
:g/^/m0 

mà sẽ thay đổi

Foo 
Bar 
Foo 
Bar 
Foo 
Baz 
Foo 
Quux 

để

Foo 
Bar 
Baz 
Quux 
0
:%s/^\(.*\)\(\n\1\)\+$/\1/ge 

đây là câu trả lời của tôi cho bạn

0

Tôi biết điều này là cũ, nhưng nó có giá trị nhắc đến sau đây cũng làm việc nếu bạn không nhớ sắp xếp cũng như (Tôi biết OP muốn tránh nó):

:sort u