Cái nhìn tiêu cực / khẳng định trước trong Linux ít máy nhắn tin (hoặc vim)


14

Tôi muốn tìm tất cả các trường hợp "chỉ mục" không được theo sau bởi .php trong nhật ký bằng cách sử dụng less. /index(?!\.php)không hoạt động. Điều này có thể không? Regex cho ít và vim là gì (chúng có khác nhau không?). Điều này là không thể với các thư viện regex tương ứng của các ứng dụng này?


Câu trả lời:


22

Trong vim, bạn có thể làm như thế này:

/index\(\.php\)\@!

Để biết thêm chi tiết, trong chế độ lệnh, hãy thử :h \@:

\@!     Matches with zero width if the preceding atom does NOT match at the
        current position. /zero-width {not in Vi}
        Like '(?!pattern)" in Perl.
        Example                 matches
        foo\(bar\)\@!           any "foo" not followed by "bar"
        a.\{-}p\@!              "a", "ap", "aap", "app", etc. not immediately
                                followed by a "p"
        if \(\(then\)\@!.\)*$   "if " not followed by "then"

Xinh đẹp! Bất cứ ý tưởng cho ít? Điều này không làm việc trong ít hơn. Tôi muốn hành vi regex là PCRE ở mọi nơi, nhưng than ôi không phải vậy.
Gregg Leventhal

7
Cũng lưu ý cú pháp cho giao diện negativ :\@<!
lanoxx 17/03/2015

Nó đi với việc nói rằng bạn cần đặt cái nhìn tiêu cực phía sau trước mẫu. Một ví dụ: \(some\)\@<!thingsẽ phù hợp thingeverythingnothing, nhưng không phải something.
lùn

7

(?!\.php)là một toán tử regrec perl. lessthường sử dụng API regex POSIX của hệ thống, do đó, điển hình là GNU mở rộng các biểu thức chính quy trên hệ thống GNU, vimsử dụng vimcác biểu thức chính quy.

Trong vim, như đã được hiển thị bởi cuonglm, tương đương index(?!\.php)sẽ là index\(\.php\)\@!hoặc \vindex(\.php)@!.

Đối với less, tại thời điểm biên dịch, bạn có thể chọn thư viện regex / API và kết quả là loại regex sẽ sử dụng:

    --with-regex={auto,gnu,pcre,posix,regcmp,re_comp,
                    regcomp,regcomp-local,none}
        Select a regular expression library  auto

Theo mặc định, mặc dù, lesssẽ sử dụng POSIX regcompvới REG_EXTENDED, vì vậy bạn sẽ nhận được các biểu thức chính quy mở rộng của hệ thống của mình, do đó, thường là một cái gì đó tương tự như với grep -E.

Trong GNU mở rộng regrec, không có cái nhìn tương đương phía sau hoặc nhìn về phía trước toán tử.

Bạn có thể làm điều đó một cách khó khăn:

index($|[^.]|\.($|([^p]|p($|([^h]|h($|[^p]))))))

Với less, bạn có thể sử dụng &khóa để lọc các dòng chứa index.php( &!index\.php) và sau đó tìm kiếm index( /index). (bạn vẫn bỏ lỡ các phiên bản khác indexxuất hiện trên một dòng cũng có chứa index.php).


1
Tôi nghĩ thư viện regex nào lesssử dụng phụ thuộc vào thời gian biên dịch.
cuonglm

@Gnouc, bạn nói đúng, thậm chí giờ nó còn hỗ trợ PCRE.
Stéphane Chazelas

Vâng, chúng tôi có thể kiểm tra nếu lesssử dụng PCREbằng cách phân tích đầu ra của ldd $(which less). Nhưng với thư viện khác, bạn có biết cách nào để kiểm tra không?
cuonglm

1
@Gnouc, nó in tên của thư viện regex với less --version.
Stéphane Chazelas

Tôi sử dụng Ubuntu 12.04 LTS và với less --verionnó, nó chỉ in less 444cùng với Bản quyền.
cuonglm
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.