2013-02-05 5 views
14

Die Mann Seite für GNU weniger Dienstprogramm sagt folgende über Suche:Was ist die Bibliothek für reguläre Ausdrücke, die von [meinem] System bereitgestellt wird?

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

Ich benutze weniger auf alle Arten von Systemen: mein persönlichen Ubuntu Laptop, Server meines CentOS Wolke, unter Cygwin bei Arbeit usw. Ich möchte immer Dinge wie negative Vorausschau und andere ausgefallene Sachen machen, aber ich weiß nicht, welche Regex-Syntax zu verwenden ist. Wie finde ich heraus?

+1

nicht eine vollständige Antwort, aber ich würde beginnen hier: http: //en.wikipedia. org/wiki/Comparison_of_regular_expression_engines – Jaxidian

+0

Danke. Irgendwelche Tipps, wie man die Bibliotheken in @hek2mgls Antwort darauf abbildet? –

Antwort

8

Es ist ein Kompilierzeitparameter. Das Skript ./configure von weniger kennt den with-regex=LIB Parameter.

Dies ist ein Zitat aus README des Upstream-Paket:

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

So würden Sie müssen wissen, wie weniger ‚wurde ./configured ". Ich habe das auf Debian/Ubuntu untersucht. Sie verwenden die POSIX regex lib.

Ich bin immer noch nach einem Weg es von einem Skript dynamisch zu erkennen ... :)


Update: Das einzige, was ich bisher geschafft haben, war zu erkennen, ob weniger PCRE reguläre Ausdrücke verwendet oder nicht. Wenn weniger konfiguriert wurde mit --with-regex=pcre wird es gegen die libpcre.so gemeinsam genutzte Bibliothek verknüpft:

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

Danke. Zumindest weiß ich jetzt, wo ich suchen muss, aber ich bin sicher, dass weitere Updates von dir hilfreich wären. Von einigen schnellen Web-Suchen, es sieht aus wie pcre ist der einzige mit der Art von erweiterten Funktionen, die ich will - würden Sie zustimmen? –

+0

wenn Sie sie bevorzugen, ok. (Ich auch :)) Ich überlege mir gerade, die 'less'-Binärdatei zu hashen, die mit mehreren' --with-regex'-Optionen kompiliert wurde, und dann einfach die Hashes zu vergleichen, um zu sagen, welche Regex-Lib verwendet wird (in einem bestimmten System). . Aber wenn du mit meiner Antwort zufrieden bist, werde ich es auch sein! :) – hek2mgl

+0

Ich bin * zufrieden * mit deiner Antwort, da sie meine Frage beantwortet. Solch ein Hash würde mich aber * glücklicher machen *. ;-) Lass es mich wissen, wenn ich etwas tun kann, um entweder zu helfen oder einen Anreiz für dich zu schaffen. Ich behalte die E-Mail-Adresse in meinem StackExchange-Profil im Auge. –

5

Ich weiß nicht, ob dies in allen Fällen funktioniert (ältere Versionen/unterschiedliche Systeme), aber ich war in der Lage diese Informationen zu finden less --version mit:

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 

So ist es GNU regex Syntax ...

Und nach einer neueren Version mit --with-regex=pcre kompilieren ich habe

aktualisieren

Dank crw zur Überprüfung. Diese Lösung scheint versionsspezifisch zu sein. Nach dem Kompilieren verfügbaren Quellcodes um greenwoodsoftware (in Linux), fand ich, dass es nicht funktioniert Arbeit für Versionen 436 (freigegeben am 25. Juli 2009) und früher. Es beginnt mit mindestens 451 (veröffentlicht am 4. September 2012) und später. (Versionen dazwischen waren nicht zum Download verfügbar).

+0

Wow, direkt unter unserer Nase. Wenn es eine Möglichkeit gibt zu überprüfen, dass dies immer der Fall ist, würde ich dies als "akzeptierte" Antwort bezeichnen. –

+2

Leider fand ich die Welt komplexer als ich geglaubt hatte ... Siehe Update oben. – flyingfinger

0

Die vorgeschlagene Antwort die Ausgabe von less --version zu beobachten war meine Situation nicht auf Solaris 10 adressieren - die ersten beiden Zeilen lesen:

less 436 
Copyright (C) 1984-2009 Mark Nudelman 

Ich kann nicht eine offensichtliche regex Bibliothek in der Liste der dynamischen Abhängigkeiten sehen :

$ 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 zeigt an, dass mehrere Regex-Schnittstellen von der Bibliothek angeboten werden: regcmp, re_comp und regcomp.

Durch elfdump gegen die binären läuft, kann ich Verweis auf das Symbol sehen 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 

Wenn dies ein Link auf die Compiler-Funktion regcomp regex ist, dann ist der Readme-Text in der Antwort von @ hek2mgl schlägt vor, dass diese less Binär POSIX Regexes (oder Spencer V8 Regexes, wenn in die Binärdatei kompiliert?) verwenden.

Die Manpage regcomp(3C) lautet:

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

in less mit sucht Experimenting, habe ich, dass die Regex Wiederholungsoperator entdeckt {...} ohne Backslash funktioniert entkommt. Die Manpage für regex(5) auf meinem System definiert dies als Extended Regular Expression (ERE) -Syntax.

Schließlich habe ich several interessante descriptions der Schnittstellen verschiedenen regex Motoren gefunden, im Folgenden zusammengefasst:

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