2013-02-05 11 views
14

La pagina di man per meno utilità di GNU dice il seguente argomento ricerca:Che cos'è la libreria di espressioni regolari fornita da [my] 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. 

Io uso meno su tutti i tipi di sistemi: il mio computer portatile personale di Ubuntu, il mio server cloud CentOS, sotto Cygwin a lavoro, ecc. Continuo a voler fare cose come look-ahead negativi e altre cose fantasiose, ma non so quale sintassi regex usare. Come lo scopro?

+1

Non è una risposta completa, ma mi piacerebbe iniziare qui: http: //en.wikipedia. org/wiki/Comparison_of_regular_expression_engines – Jaxidian

+0

Grazie. Qualche consiglio su come mappare le biblioteche nella risposta di @ hek2mgl a questo? –

risposta

8

È un parametro di tempo di compilazione. Lo script ./configure di less conosce il parametro with-regex=LIB.

Questa è una citazione da README del pacchetto di monte:

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

Quindi si avrebbe bisogno di sapere come è stato meno' ./configured '. Ho studiato questo su Debian/Ubuntu. Usano la regex lib di POSIX.

Sono ancora alla ricerca di un modo per rilevare dinamicamente da uno script ... :)


Update: L'unica cosa che sono riuscito finora è stato quello di rilevare se meno utilizza espressioni regolari PCRE o no. Se meno è stata progettata con --with-regex=pcre è collegata contro il libpcre.so libreria condivisa:

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

Grazie. Almeno ora so dove guardare, ma sono sicuro che ulteriori aggiornamenti da parte tua sarebbero utili. Da alcune ricerche rapide sul Web, sembra che pcre sia l'unico con il tipo di funzionalità avanzate che desidero: sarebbe d'accordo? –

+0

se li preferisci, ok. (anche io :)) Attualmente sto pensando di eseguire l'hashing del binario 'less', compilato con diverse opzioni' --with-regex', e poi basta confrontare gli hash per dire quale regex lib è usata (in un certo sistema) . Ma se sei felice della mia risposta, lo sarò anch'io! :) – hek2mgl

+0

Sono * soddisfatto * con la tua risposta, poiché risponde alla mia domanda. Un simile hash mi renderebbe * più felice *, però. ;-) Fammi sapere se c'è qualcosa che posso fare per aiutarti o per incentivarti. Controllerò per ora l'indirizzo email nel mio profilo StackExchange. –

5

Non so se questo funziona in tutti i casi (le vecchie versioni/sistemi differenti), ma sono stato in grado di trovare queste informazioni utilizzando 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 

Quindi è la sintassi regex GNU ...

E dopo la compilazione di una nuova versione con --with-regex=pcre ho ottenuto

less 481 (PCRE regular expressions) 
... 

Aggiornamento

Grazie a crw per il controllo. Questa soluzione sembra specifica per la versione. Dopo aver compilato il codice sorgente disponibile su greenwoodsoftware (in Linux), ho riscontrato che lo non funziona per le versioni 436 (rilasciato il 25 luglio 2009) e precedenti. Inizia a funzionare almeno di 451 (pubblicato il 4 settembre 2012) e successivamente. (Le versioni intermedie non erano disponibili per il download).

+0

Wow, proprio sotto il nostro naso. Se c'è un modo per verificare che questo sia sempre il caso, contrassegno questa risposta "accettata". –

+2

Sfortunatamente, ho trovato il mondo più complesso di quanto credessi ... Vedi l'aggiornamento sopra. – flyingfinger

0

La risposta suggerita per osservare l'output di less --version non ha affrontato la mia situazione su Solaris 10 - le prime due righe leggono:

less 436 
Copyright (C) 1984-2009 Mark Nudelman 

non riesco a vedere una libreria regex evidente nella lista delle dipendenze dinamiche :

$ 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 indica che più interfacce regex sono offerti dalla biblioteca: regcmp, re_comp e regcomp.

Eseguendo elfdump contro il binario, posso vedere i riferimenti al simbolo 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 

Se si tratta di un collegamento alla funzione di compilazione regcomp regex, quindi il file README-text nella risposta da @ hek2mgl suggerisce che questo binario less possa usare regex POSIX (o regex di Spencer V8, se compilato nel binario?).

La pagina man per regcomp(3C) legge:

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

Sperimentare con le ricerche in less, ho scoperto che l'operatore di ripetizione regex {...} funziona senza backslash. La manpage per regex(5) sul mio sistema lo definisce come sintassi ERE (Extended Regular Expression).

Infine, ho trovato interessante severaldescriptions delle interfacce dei vari motori di regex, riassunti qui di seguito:

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