2011-09-18 32 views
11

dữ liệu của tôi là có dạng:Làm thế nào để xóa văn bản sau khi một biểu tượng quy định tại Vim

id|name|things that I don't care 

Vì vậy, đối với mỗi dòng tôi muốn xóa văn bản sau khi biểu tượng thứ hai |.

Làm cách nào để thực hiện việc này trong Vim bằng một lệnh?

Edit:

Thực tế, có ống thêm sau khi thứ hai |, kể từ khi | được sử dụng như là dấu phân cách cho các cột.

Trả lời

18

Một giải pháp:

:%s!^\([^|]*|\)\{2\}\zs.*!! 

Giải thích:

  • %: trên mỗi dòng
  • s: subtitute
  • !: bắt đầu của mô hình
  • ^: bắt đầu của dòng
  • \(: bắt đầu của nhóm
  • [^|]*: bất kỳ số lượng các ký tự không ống
  • |: theo sau là một đường ống
  • \): cuối nhóm
  • \{2\}: phù hợp với hai tội danh nhóm
  • \zs: bắt đầu mô hình phù hợp ở đây
  • .*: bất kỳ ký tự
  • !: cuối mẫu và bắt đầu thay thế
  • !: kết thúc thay thế

Điều này sẽ để lại các đường có ít hơn hai ống bị ảnh hưởng và cũng sẽ xử lý wi dòng thứ có nhiều hơn hai đường ống ...

Trước

id name things that I don't care no pipes 
id|name things that I don't care one pipe 
id|name|things that I don't care two pipes 
id|name|things that I don't care extra pipe at line end| 
id|name|things that I don't care | extra pipe mid-line 
id|name|things that I don't| care| two extra pipes 
name|things that I don't care missing first column and pipe 
|name|things that I don't care missing first column 

Sau:

id name things that I don't care no pipes 
id|name things that I don't care one pipe 
id|name| 
id|name| 
id|name| 
id|name| 
name|things that I don't care missing first column and pipe 
|name| 
+1

Cảm ơn bản demo của '\ zs' –

+0

@Michael Dunn: Bạn rất được hoan nghênh! – Johnsyweb

+1

Giải thích rất kỹ lưỡng! –

0

tôi sẽ làm một cái gì đó như:

%s/\(.*|.*|\).*/\1 

Yeap, mà làm việc:

yeap

+3

Chỉ khi có chính xác hai ống trên đường dây, bởi vì "những thứ mà tôi không quan tâm" chỉ có thể có một đường ống ... có lẽ ... bạn không bao giờ biết. :) #nitpicking –

1

Nếu "không quan tâm" một phần không có đường ống, sau đó

:%s/|[^|]*$/|/ 

mà cũng giao dịch với trống rỗng "không quan tâm" các bộ phận. Và nó vẫn hoạt động nếu bạn thêm các trường mới trước phần "không quan tâm".

11

Người ta chỉ cần lặp lại lệnh chế độ thông thường nhảy tới ký tự tiếp theo đến biểu tượng | thứ hai và xóa cho đến cuối dòng cho mỗi dòng .

:%norm!2f|lD 
+1

Điều này là rất tốt đẹp thực sự. Tốt hơn [VimGolf] (http://vimgolf.com/) điểm hơn câu trả lời của tôi quá! – Johnsyweb

+1

@Johnsyweb: Cảm ơn! Tôi sẽ nói nó là tự nhiên hơn, vì nó theo dòng chảy chỉnh sửa thông thường chỉ lặp lại các lệnh mà người ta sử dụng để thực hiện nhiệm vụ trên một dòng. –

0

:%s/[^|]*|[^|]*|\zs.*//

Một biến thể của những gì chúng ta đã thấy.

Khớp với nhiều "không phải đường ống" theo sau là đường ống, hai lần. Thay thế bằng không có gì bắt đầu từ ống thứ hai (\ zs).

+0

Thao tác này sẽ xóa đường ống thứ hai, không chỉ là "văn bản sau ký hiệu '' | '' thứ hai." – Johnsyweb

+1

Tôi biết. Tôi đã cố gắng thông minh. Đọc cái ống đó là cái tách cột Tôi đã hình dung rằng không cần phải có một cái cuối cùng vì không có cái nào ở đầu. Tôi nên đã nói nó trên văn bản mặc dù. – johnny

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