2013-02-05 11 views
14

człowiek aktualizacja mniej narzędzia GNU mówi po około wyboru:Co to jest "biblioteka wyrażeń regularnych dostarczana przez [mój] system"?

/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. 

używam mniej na wszelkiego rodzaju systemów: moim osobistym laptopie Ubuntu moim cloud serwerze CentOS, pod Cygwin w praca, itp. Ciągle chcę robić rzeczy takie jak negatywne spojrzenia z wyprzedzeniem i inne wymyślne rzeczy, ale nie wiem, jakiej składni regex użyć. Jak się dowiedzieć?

+1

nie do pełnych odpowiedzi, ale zacznę tutaj: http: //en.wikipedia. org/wiki/Comparison_of_regular_expression_engines – Jaxidian

+0

Dzięki. Wszelkie porady dotyczące mapowania bibliotek w odpowiedzi @ hek2mgl na to? –

Odpowiedz

8

Jest to parametr czasu kompilacji. Skrypt ./configure mniej zna parametr with-regex=LIB.

Jest to cytat z README pakietu upstream:

--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). 

Więc trzeba by wiedzieć, jak było mniej”./configured ". Badałem to na Debianie/Ubuntu. Korzystają z biblioteki wyrażeń regularnych POSIX.

ja wciąż szukają sposobu, aby go wykryć dynamicznie przez skrypt ... :)


Update: Jedyne, co udało mi się do tej pory było wykryć czy mniej korzysta regexes pcre albo nie. Jeśli został skonfigurowany przy użyciu mniej --with-regex=pcre jest ona związana przeciwko libpcre.so udostępnionej biblioteki:

#!/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

Dzięki. Przynajmniej wiem teraz, gdzie szukać, ale jestem pewien, że pomocne byłyby dalsze aktualizacje od ciebie. Z niektórych szybkich wyszukiwań internetowych wygląda na to, że PCR jest jedynym z zaawansowanymi funkcjami, jakie chcę - zgodziłbyś się? –

+0

jeśli wolisz, ok. (ja też :)) Obecnie myślę o mieszaniu binarnego "less", skompilowanego z kilkoma opcjami '--with-regex', a następnie wystarczy porównać skróty, aby powiedzieć, które regex lib jest używane (w pewnym systemie) . Ale jeśli jesteś zadowolony z mojej odpowiedzi, ja też będę! :) – hek2mgl

+0

Jestem * zadowolony * z twojej odpowiedzi, ponieważ odpowiada na moje pytanie. Taki hasz uczyniłby mnie * szczęśliwszym *. ;-) Daj mi znać, jeśli jest coś, co mogę zrobić, aby albo pomóc, albo zachęcić cię. Na razie będę miał na oku adres e-mail w moim profilu StackExchange. –

5

Nie wiem, czy to działa we wszystkich przypadkach (starsze wersje/różne systemy), ale udało mi się znaleźć to info stosując 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 

Więc to GNU składni regex ...

a po kompilacji nowszą wersję z --with-regex=pcre mam

less 481 (PCRE regular expressions) 
... 

Aktualizacja

Dzięki crw sprawdzania. To rozwiązanie wydaje się być specyficzne dla wersji. Po skompilowaniu dostępnego kodu źródłowego pod numerem greenwoodsoftware (w systemie Linux) okazało się, że to nie pracuje w wersjach 436 (wydana 25 lipca 2009 r.) I wcześniejszych niż. Rozpoczyna pracę o co najmniej 451 (wydane 4 września 2012 r.) I później. (Wersje pomiędzy tymi wersjami nie były dostępne do pobrania).

+0

Wow, tuż pod naszymi nosem. Jeśli istnieje sposób sprawdzenia, czy tak jest zawsze, zaznaczę to jako "zaakceptowaną" odpowiedź. –

+2

Niestety, okazało się, że świat jest bardziej złożony, niż sądziłem ... Zobacz aktualizację powyżej. – flyingfinger

0

Sugerowana odpowiedź obserwować wyjście less --version nie zająć moją sytuację na Solaris 10 - pierwsze dwa wiersze czytać:

less 436 
Copyright (C) 1984-2009 Mark Nudelman 

Nie widzę oczywisty bibliotekę regex na liście dynamicznych zależnościach :

$ 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 wskazuje, że wiele interfejsów regex są oferowane przez bibliotekę: regcmp, re_comp i regcomp.

Uruchamiając elfdump przeciwko binarnego, widzę odniesienia do symbolu 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 

Jeśli to jest link do funkcji kompilator regcomp regex, wówczas README-text odpowiedź od @ hek2mgl sugeruje, że ten plik binarny może wykorzystywać wyrażenia regularne POSIX (lub wyrażenia Spencer V8, jeśli zostały skompilowane do pliku binarnego?).

Strona man dla regcomp(3C) brzmi:

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

Eksperymentowanie z wyszukiwań w less, odkryłem, że wyrażenie regularne powtarzanie {...} operator działa bez backslashem ucieka. Strona podręcznika dla regex(5) w moim systemie definiuje to jako składnię Extended Regular Expression (ERE).

Wreszcie znalazłem several interesujący descriptions interfejsów różnych silników regex, podsumowane poniżej:

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() 
Powiązane problemy