tìm kiếm các dòng có chứa mẫu nhưng không chứa mẫu thứ hai


15

Tôi cần tìm kiếm các dòng có chứa một số từ nhưng không chứa từ thứ hai.

Ví dụ: tìm các dòng có chứa từ "Đây" nhưng không phải từ "đỏ"

để một tập tin chứa những dòng này

This is a blue coat
This is a red  coat
This is a purple coat
That is a coat

Việc tìm kiếm sẽ chỉ xác định vị trí dòng đầu tiên và thứ ba.

Cảm ơn vì lời khuyên!


Bạn có thể sử dụng plugin LogiPat được phân phối với Vims mới hơn
Christian Brabandt

Câu trả lời:


23

Bạn có thể sử dụng lệnh này để in các dòng có chứa Thisvà không red:

:g/\(.*This\)\&\(.*red\)\@!
  • \&phân tách các nhánh như một logic ANDbởi vì chúng ta muốn các dòng thỏa mãn hai điều kiện (các nhánh),
  • \(.*This\)là nhánh đầu tiên, nó có thể đơn giản Thisnhưng nó chung chung hơn theo cách đó,
  • \(.*red\)\@!là nhánh thứ hai, \@!có nghĩa là "khớp chiều rộng bằng 0 nếu nguyên tử trước không khớp", giống như logic NOT.

Nói cách khác:

\(.*This\)  \&  \(.*red\)\@!
°°°°°°°°°°  °°  °°°°°°°°°°°°
'This'      AND NOT 'red'

Rất cám ơn, điều này rất giống như một truy vấn thông qua văn bản được định dạng. Tôi đã có thể sử dụng điều này để tìm các chức năng thiếu tài liệu.
Joshua Detwiler 23/07/18

1

Hãy xem bài viết này.

Kết hợp nó với câu trả lời @romainl và bạn có thể làm bất cứ điều gì bạn muốn.

Ví dụ: Giả sử tôi muốn thêm a constvào các hàm không có chúng.

    handleChange = value => {

Kịch bản VIM:

%s/\([ ]*\)\(\w* = .*$\)\&^\(\&\(.*const.*\)\@!.\)*$/\1const \2/gc

Đầu ra:

    const handleChange = value => {

Giải trình:

\([ ]*\)\(\w* = .*$\)

- lấy cho tôi tất cả các dòng có word =

\&

- quy tắc kết hợp

^\(\&\(.*const.*\)\@!.\)*$

- dòng không nên chứa const.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.