2009-08-20 26 views
397

Tôi có một tập tin HTML lớn mà đã có rất nhiều đánh dấu trông như thế này:Làm thế nào tôi có thể làm cho trận đấu của tôi không tham lam trong vim?

<p class="MsoNormal" style="margin: 0in 0in 0pt;"> 
    <span style="font-size: small; font-family: Times New Roman;">stuff here</span> 
</p> 

Tôi đang cố gắng để làm một Vim tìm kiếm và thay thế để thoát khỏi tất cả class=""style="" nhưng tôi gặp rắc rối khi không phù hợp.

nỗ lực đầu tiên của tôi là này

%s/style=".*?"//g 

nhưng Vim dường như không thích ?. Thật không may khi xóa ? làm cho trận đấu quá tham lam.

Làm cách nào để tôi có thể không phù hợp?

+0

Tôi nghĩ Câu trả lời của Paul là tốt. Chỉ cần nói rằng "?" không có nghĩa là tùy chọn trong vim (nếu đây là những gì bạn muốn đạt được bằng cách sử dụng "?") – LB40

+11

@LB, bằng nhiều ngôn ngữ,. *? có nghĩa là phù hợp với bất kỳ nhân vật nào nhưng không tham lam. Đó là những gì anh ta đang cố gắng đạt được. –

Trả lời

608

Thay vì sử dụng .*.\{-}.

%s/style=".\{-}"//g

Ngoài ra, xem :help non-greedy

+1

Nếu ': help non-greedy' không hoạt động, hãy thử': help/\ {- ' –

+21

Không phải rất trực quan, đây có phải là thứ mà chỉ vim không? –

+7

Có. Vim có ngôn ngữ biểu thức chính quy riêng. –

40

Có gì sai với

%s/style="[^"]*"//g 
+2

Không có gì! Không có gì sai cả! :) –

+3

Mặc dù, vì lợi ích của riêng tôi, tôi vẫn muốn hiểu rõ hơn về điều không phù hợp. –

+1

@Mark, chỉ cần thêm ghi chú vào câu trả lời của tôi về chương tuyệt vời về regexps bao gồm điều này trong cuốn sách "sed & awk" –

9

tôi đã tìm thấy rằng một giải pháp tốt để loại câu hỏi là:

 
:%!sed ... 

(hoặc perl nếu bạn thích). IOW, thay vì học các đặc điểm regex của vim, hãy sử dụng công cụ bạn đã biết. Sử dụng perl sẽ làm cho? sửa đổi làm việc để không phù hợp với trận đấu.

+2

điểm tốt, nhưng có thể thực hiện '/ pattern' để kiểm tra xem bạn có phù hợp với mẫu không một cách chính xác trước khi áp dụng nó và sử dụng 'c' sửa đổi trong biểu thức chính quy vim của bạn cũng tốt đẹp :) –

+0

điều này là chính xác. tất cả các giải pháp ở đây không gần với tham lam! nếu bạn phải khớp với [0-9] \ {7} trong một hàng với nhiều văn bản và một vài lần xuất hiện của mẫu đó, thì sẽ không có giải pháp nào ở đây. Các giải pháp ở đây chỉ làm việc cho những điều đơn giản (công bằng, là những gì được hỏi). nhưng nếu bạn đang làm nhiều hơn một chút so với tìm kiếm cho đến khi các báo giá tiếp theo, vim sẽ không giúp đỡ. – gcb

-2

G'day,

Xử lý regexp của Vim không quá rực rỡ. Tôi đã tìm thấy rằng cú pháp regexp cho sed là về kết hợp phù hợp với khả năng của vim.

Tôi thường đặt đánh dấu tìm kiếm trên (: set hlsearch) và sau đó chơi với regexp sau khi nhập dấu gạch chéo để vào chế độ tìm kiếm.

Edit: Mark, mà lừa để giảm thiểu phù hợp với tham lam cũng được đề cập trong cuốn sách tuyệt vời Dale Dougherty của "Sed & AWK" (sanitised Amazon link).

Chương ba "Hiểu cú pháp biểu thức chính quy" là một phần giới thiệu tuyệt vời cho các khả năng regexp nguyên thủy liên quan đến sed và awk. Chỉ đọc ngắn và được khuyến nghị cao.

HTH

cổ vũ,

+6

Việc xử lý regex của Vim thực sự khá tốt. Nó có thể làm những điều mà sed không thể, như kết hợp trên số dòng/cột hoặc kết hợp dựa trên phân loại từng ngôn ngữ của các ký tự như từ khóa hoặc số nhận dạng hoặc khoảng trắng. Nó cũng có các xác nhận chiều rộng bằng 0 và khả năng đặt các biểu thức ở phía bên phải của một sự thay thế. Nếu bạn sử dụng '\ v' nó giúp làm sạch cú pháp lên rất nhiều. –

+0

@Brian, chúc mừng. Tôi sẽ làm một trợ giúp regex và xem những gì tôi đã mất tích. –

45

tìm kiếm không tham lam trong vim được thực hiện sử dụng {-} điều hành.Như thế này:

%s/style=".\{-}"//g 

chỉ thử:?

:help non-greedy 
13

Nếu bạn cú pháp regex PCRE thoải mái hơn, mà

  1. hỗ trợ các nhà điều hành không tham lam, như bạn hỏi trong OP ; và
  2. không yêu cầu các nhà khai thác nhóm và các nhà khai thác thẻ hợp lệ (yêu cầu cú pháp vim hoàn toàn ngược trực giác vì bạn không khớp các ký tự chữ cái nhưng chỉ định toán tử); và
  3. bạn có [g] vim được biên dịch với tính năng perl, thử nghiệm sử dụng

    : tính năng kiểm tra và kiểm tra; nếu + perl là có bạn tốt để đi)

tìm kiếm try/thay thế bằng

:perldo s/// 

Ví dụ. Swap src và alt thuộc tính trong thẻ img:

<p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p> 

:perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/ 

<p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p> 
1

Với \v (như đề xuất trong một số bình luận)

:%s/\v(style|class)\=".{-}"//g 
1

Plugin eregex.vim xử lý Perl kiểu nhà khai thác không tham lam *?+?

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