2015-06-26 13 views
5

Tôi có một tập tin lớn chứa nhiều dòng theo định dạng sau,Vim loại bỏ một phần của dòng trong một file

<SomeString1>Key1</SomeString> 
<SomeString2>Key2</SomeString> 
<SomeString3>Key3</SomeString> 
... 

tôi muốn loại bỏ các thẻ, và đầu ra sẽ giống như thế,

Key1 
Key2 
Key3 
... 

thuật toán, tôi nên viết một cái gì đó như:

For all lines: 
    Remove all string before character `>` 
    Remove all string after character `</` 

Trả lời

7

Đơn giản chỉ cần sử dụng một thay thế :

:%s/<[^>]*>//g 

này sẽ áp dụng các s (thay) lệnh cho mỗi dòng (%) và loại bỏ tất cả <...> trình tự do cho toàn bộ dòng (g).

Có nhiều tình huống trong đó các lệnh này có ích, đặc biệt là sử dụng regex. Bạn có thể tìm thêm thông tin về nó here.

+0

Nó hoạt động hoàn hảo. – Sait

2

Hai lệnh nên làm các trick:

:%s/<\w*>// 
:%s/<\/\w*>// 

Đầu tiên thay thế tất cả các thẻ mở với không có gì. Cái thứ hai thay thế tất cả các thẻ đóng không có gì. <\w*> khớp với bất kỳ số ký tự chữ và số nào giữa các số <><\/\w*> khớp với bất kỳ số ký tự chữ và số nào giữa </>.

Edit: một cách đơn giản hơn:

:%s/<.\{-}>//g 

Lưu ý rằng đây:

:%s/<.*>//g 

Sẽ không làm việc vì * là "tham lam" và sẽ phù hợp với toàn bộ dòng. \{-} là tương đương không tham lam. Đọc thêm về tham lam tại đây: http://vimregex.com/#Non-Greedy

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