2013-02-05 43 views
14

Trang người cho tiện ích ít GNU cho biết như sau về tìm kiếm:'Thư viện biểu thức chính quy được cung cấp bởi hệ thống [của tôi] là gì?

/pattern 
    Search forward in the file for the N-th line containing the pattern. N 
    defaults to 1. The pattern is a regular expression, as recognized by the 
    regular expression library supplied by your system. 

tôi sử dụng ít trên tất cả các loại hệ thống: máy tính xách tay Ubuntu cá nhân của tôi, máy chủ điện toán đám mây CentOS của tôi, dưới Cygwin tại công việc, v.v. Tôi tiếp tục muốn làm những việc như những cái nhìn tiêu cực và những thứ lạ mắt khác, nhưng tôi không biết cú pháp regex nào để sử dụng. Làm sao tôi biết được?

+1

Không phải là một câu trả lời đầy đủ, nhưng tôi muốn bắt đầu ở đây: http: //en.wikipedia. org/wiki/Compare_of_regular_expression_engines – Jaxidian

+0

Cảm ơn. Bất kỳ lời khuyên nào về cách ánh xạ các thư viện trong câu trả lời của @ hek2mgl cho điều này? –

Trả lời

8

Đây là tham số thời gian biên dịch. Tập lệnh ./configure ít biết thông số with-regex=LIB.

Đây là trích dẫn từ README của gói thượng nguồn:

with-regex = lib

 Specifies the regular expression library used by less for pattern 
    matching. The default is "auto", which means the configure program 
    finds a regular expression library automatically. Other values are: 
     posix   Use the POSIX-compatible regcomp. 
     pcre   Use the PCRE library. 
     regcmp   Use the regcmp library. 
     re_comp  Use the re_comp library. 
     regcomp  Use the V8-compatible regcomp. 
     regcomp-local Use Henry Spencer's V8-compatible regcomp 
         (source is supplied with less). 

Vì vậy, bạn sẽ cần phải biết làm thế nào ít bị' ./configured '. Tôi đã điều tra điều này trên Debian/Ubuntu. Họ sử dụng POSIX libex lib.

tôi vẫn đang tìm kiếm một cách để phát hiện ra nó tự động bởi một kịch bản ... :)


Cập nhật: Điều duy nhất tôi đã quản lý cho đến nay là để phát hiện xem ít sử dụng regexes PCRE hay không. Nếu ít đã được cấu hình sử dụng --with-regex=pcre nó được liên kết chống lại libpcre.so thư viện chia sẻ:

#!/bin/bash 

# ldd prints out the shared libraries a binary is linked to. 
# This can be used to check if less is linked against libpcre 
if ldd "$(which less)" | grep 'libpcre\.so' ; then 
    echo "less uses pcre regex syntax" 
else 
    echo "less uses non pcre regex syntax" 
    # ... more checks should follow. currently trying to find a way 
fi 
+0

Cảm ơn. Ít nhất tôi biết bây giờ nơi để tìm, nhưng tôi chắc chắn cập nhật thêm từ bạn sẽ hữu ích. Từ một số tìm kiếm web nhanh chóng, có vẻ như pcre là người duy nhất có loại tính năng nâng cao mà tôi muốn — bạn có đồng ý không? –

+0

nếu bạn thích chúng, ok. (Tôi cũng vậy :)) Tôi hiện đang nghĩ về việc băm nhỏ 'binary', được biên dịch với một số tùy chọn' --with-regex', và sau đó chỉ cần so sánh các hash để nói rằng regex lib được sử dụng (tại một hệ thống nào đó) . Nhưng nếu bạn hài lòng với câu trả lời của tôi, tôi cũng vậy! :) – hek2mgl

+0

Tôi hài lòng * với câu trả lời của bạn, vì câu trả lời cho câu hỏi của tôi. Một băm như vậy sẽ khiến tôi * hạnh phúc hơn *. ;-) Hãy cho tôi biết nếu có bất kỳ điều gì tôi có thể làm để giúp đỡ hoặc khuyến khích bạn. Tôi sẽ theo dõi địa chỉ email trong tiểu sử StackExchange của tôi ngay bây giờ. –

5

Tôi không biết nếu điều này làm việc trong mọi trường hợp (phiên bản cũ/hệ thống khác nhau) nhưng tôi đã có thể tìm thấy thông tin này sử dụng less --version:

less 458 (GNU regular expressions) 
Copyright (C) 1984-2012 Mark Nudelman 

less comes with NO WARRANTY, to the extent permitted by law. 
For information about the terms of redistribution, 
see the file named README in the less distribution. 
Homepage: http://www.greenwoodsoftware.com/less 

Vì vậy, nó là cú pháp regex GNU ...

Và sau khi biên dịch một phiên bản mới hơn với --with-regex=pcre tôi đã

less 481 (PCRE regular expressions) 
... 

Cập nhật

Nhờ crw để kiểm tra. Giải pháp này có vẻ là phiên bản cụ thể. Sau khi biên dịch mã nguồn sẵn có tại greenwoodsoftware (trong Linux), tôi thấy rằng nó không hoạt động cho các phiên bản 436 (phát hành ngày 25 tháng 7 năm 2009) và trước đó. Nó bắt đầu hoạt động ít nhất 451 (phát hành ngày 4 tháng 9 năm 2012) và sau đó. (Các phiên bản ở giữa không có sẵn để tải xuống).

+0

Wow, ngay dưới mũi của chúng tôi. Nếu có một cách để xác minh rằng đây luôn là trường hợp, tôi sẽ đánh dấu câu trả lời 'được chấp nhận' này. –

+2

Thật không may, tôi thấy thế giới phức tạp hơn tôi tưởng ... Xem bản cập nhật ở trên. – flyingfinger

0

Câu trả lời gợi ý để quan sát đầu ra của less --version không giải quyết tình trạng của tôi trên Solaris 10 - hai dòng đầu tiên đọc:

less 436 
Copyright (C) 1984-2009 Mark Nudelman 

Tôi không thể nhìn thấy một thư viện regex rõ ràng trong danh sách phụ thuộc năng động :

$ ldd /usr/bin/less 
     libcurses.so.1 =>  /lib/libcurses.so.1 
     libc.so.1 =>  /lib/libc.so.1 
     libm.so.2 =>  /lib/libm.so.2 
     /lib/libm/libm_hwcap1.so.2 
     /platform/sun4v/lib/libc_psr.so.1 

man libc chỉ ra rằng nhiều giao diện regex được cung cấp bởi thư viện: regcmp, re_compregcomp.

Bằng cách chạy elfdump so với nhị phân, tôi có thể thấy tham chiếu đến các biểu tượng regcomp:

$ elfdump /usr/bin/less | egrep -i 'posix|pcre|regcmp|re_comp|regcomp|regcomp-local' 
    [452] 0x0003d6a0 0x00000000 FUNC GLOB D 0 UNDEF   regcomp 
      [452]  regcomp 
    R_SPARC_JMP_SLOT   0x3d6a0   0 .rela.plt  regcomp 

Nếu đây là một liên kết đến regcomp regex chức năng biên dịch, sau đó các README văn trong câu trả lời từ @ hek2mgl gợi ý rằng số nhị phân less này có thể sử dụng các cụm từ POSIX (hoặc các regex của Spencer V8, nếu được biên dịch thành nhị phân?).

Các trang người đàn ông cho regcomp(3C) đọc:

DESCRIPTION 
    These functions interpret basic and extended regular expres- 
    sions (described on the regex(5) manual page). 

Thử nghiệm với các tìm kiếm trong less, tôi đã phát hiện ra rằng các nhà điều hành lặp lại regex {...} hoạt động mà không xuyệc ngược thoát. Trang manpage cho regex(5) trên hệ thống của tôi định nghĩa cú pháp này dưới dạng cú pháp Biểu thức chính quy mở rộng (ERE).

Cuối cùng, tôi đã tìm thấy several thú descriptions các giao diện của động cơ regex khác nhau, tóm tắt dưới đây:

Engine   Interface 
---------------- -------------------------------- 
GNU    re_compile_pattern() and regex.h 
PCRE    pcre_compile and pcre.h/pcre2_compile and pcre2.h 
POSIX    regcomp() and regex.h 
Henry Spencer V8 regcomp() and regexp.h 
BSD    re_comp() 
System V   regcmp() 
Các vấn đề liên quan