2013-02-05 9 views
14

GNUの以下ユーティリティのページは述べています検索については、次の私の個人的なUbuntuのラップトップ、私のCentOSのクラウドサーバ、Cygwinの下で:[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. 

は、私が使用しているシステムのすべての種類の少ない私は否定的な先読みやその他の工夫をしたいと思っていますが、正規表現の構文を知りません。どうすればわかるのですか?

+1

ない完全な答えが、私はここに起動したいします。http://en.wikipediaを。 org/wiki/Comparison_of_regular_expression_engines – Jaxidian

+0

ありがとうございます。 @ hek2mglの答えにライブラリをマップする方法に関するアドバイスはありますか? –

答えて

8

これはコンパイル時のパラメータです。 lessの./configureスクリプトは、with-regex=LIB paramを知っています。

これは、上流のパッケージのREADMEからの引用です:あなたは「./configuredたかあまり知っておく必要があるだろう

--with-正規表現= 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). 

'私はこれをDebian/Ubuntuで調べました。彼らはPOSIX regex libを使います。

私はまだスクリプトによって動的にそれを検出するための方法を探しています... :)


アップデート:私はこれまで管理している唯一のものはあまり用途はPCRE正規表現かどうかを検出しましたか否か。以下は--with-regex=pcreを使用して構成されていた場合、それはlibpcre.so共有ライブラリに対してリンクされています

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

ありがとうございます。少なくとも私はどこから見たらいいか分かっていますが、あなたからの更なるアップデートが役立つと確信しています。 いくつかのクイックウェブ検索では、私が望む高度な機能を備えた唯一のものがpcreのようです。 –

+0

ご希望の場合は、[OK]をクリックします。私は現在、いくつかの '--with-regex'オプションでコンパイルした' less'バイナリをハッシュしようと考えています。次に、どのシステムでどの正規表現ライブラリが使われているのかを比較するだけです。しかし、あなたが私の答えに満足しているなら、私はあまりにも寛容です! :) – hek2mgl

+0

私の質問に答えるので、私はあなたの答えに満足しています。そのようなハッシュは私を幸せにするでしょう。 ;-)私が助けるか、あなたにインセンティブを与えるために私ができることがあれば教えてください。 StackExchangeプロファイルの電子メールアドレスに注目します。 –

5

これはすべてのケースで動作するかどうかはわからない(古いバージョン/異なるシステム)が、私はこの情報を見つけることができました...だから、それはGNUの正規表現の構文です

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 

そして--with-regex=pcreに新しいバージョンをコンパイルした後、私は

を得た: less --versionを使用してチェックする crwから​​

更新

感謝。 この解決方法は、バージョン固有のと思われます。 greenwoodsoftware(Linux版)で利用可能なソースコードをコンパイルした後、がバージョン436(2009年7月25日リリース)以前のバージョンでは動作しないことがわかりました。少なくとも451(2012年9月4日リリース)以降の作業を開始します。 (これらの間のバージョンはダウンロードできませんでした)。

+0

うわー、私たちの鼻のすぐ下に。これが常にそうであることを確認する方法がある場合は、これを「受け入れられた」回答にします。 –

+2

残念ながら、世界は私が信じていたよりも複雑であることがわかりました...上記の更新を見てください。 – flyingfinger

0

less --versionの出力は、Solaris 10上の私の状況に対処しなかった観測する提案の答え - 最初の2行は読み:

less 436 
Copyright (C) 1984-2009 Mark Nudelman 

私は、動的依存関係のリストで明らかに正規表現ライブラリを参照することはできません:regcmp、​​とregcomp

$ 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は、複数の正規表現インタフェースはライブラリによって提供されることを示しています。

バイナリに対してelfdumpを実行することにより、私は、シンボルregcompへの参照を確認できます。これはregcomp正規表現コンパイラ機能へのリンクである場合は、@ hek2mglからの回答で、その後README-テキストを

$ 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 

をこのlessバイナリはPOSIX正規表現(またはバイナリにコンパイルされている場合はSpencer V8正規表現)を使用する可能性があることを示唆しています。

regcomp(3C)のmanページには、読み取ります

lessで検索を試す
DESCRIPTION 
    These functions interpret basic and extended regular expres- 
    sions (described on the regex(5) manual page). 

、私は正規表現の繰り返しオペレータは、バックスラッシュエスケープなしで動作{...}ことを発見しました。私のシステム上のregex(5)のマンページは、これを拡張正規表現(ERE)の構文として定義しています。

最後に、私は、様々な正規表現エンジンのインターフェースのseveral興味深いdescriptionsを見つけ以下に要約しました:

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() 
関連する問題