2013-02-05 23 views
14

GNU az yardımcı program için adam sayfa diyor arama hakkında aşağıdaki: benim kişisel Ubuntu laptop, benim CentOS bulut sunucusuna, Cygwin at:[my] sistem tarafından sağlanan normal ifade kitaplığı nedir?

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

kullandığım sistemleri her türlü üzerinde az Çalışmak, vb. Olumsuz bakmak-aheads ve diğer fantezi şeyler gibi şeyler yapmak istiyorum, ama kullanmak için hangi regex sözdizimi bilmiyorum. Nasıl öğrenebilirim?

+1

değil tam cevap, ama burada başlardım:

Son olarak, aşağıda özetlenen çeşitli regex motorlarının arayüzleri, bir several ilginç descriptions buldum http: //en.wikipedia. org/wiki/Comparison_of_regular_expression_engines – Jaxidian

+0

Teşekkürler. Terazileri haritalamak için @ hek2mgl'ın buna cevabıyla ilgili herhangi bir tavsiye var mı? –

cevap

8

Bu bir derleme zamanı parametresidir. Daha az olan ./configure betiği with-regex=LIB parametresini bilir.

Bu

memba paketin README bir alıntı:

--with-regex Yani daha az './configured nasıl bilmesi gerekir

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

= lib '. Bunu Debian/Ubuntu'da araştırdım. POSIX regex lib kullanırlar. Hala bir yol arıyorum

:) ... Bir komut dosyası tarafından dinamik olarak


Güncelleme bunu tespit etmek: Şimdiye kadar idare ettik tek şey daha az pcre Regexes kullanıp kullanmadığını tespit etmek oldu ya da değil. az --with-regex=pcre kullanılarak yapılandırılmışsa o libpcre.so paylaşılan kitaplığa karşı bağlanmıştır:

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

Teşekkürler. En azından şimdi nerede bakacağımı biliyorum ama eminim sizden daha fazla güncelleme yardımcı olacaktır. Bazı hızlı web aramalarından, istediğim gelişmiş özelliklere sahip tek kişi pcre gibi görünüyor, kabul ediyor musunuz? –

+0

Eğer onları tercih ederseniz, tamam. (Bende çok :)) Şu anda birkaç '--with-regex' seçeneğiyle derlenmiş 'less' binary'sini karıştırmayı düşünüyorum ve sonra sadece hangi regex lib'in kullanıldığını (belli bir sistemde) söylemek için karmaları karşılaştırıyorum. . Ama cevabımdan memnunsanız, ben de olacağım! :) – hek2mgl

+0

Cevabımla, yanıtımı verdiğim için * memnunum *. Böyle bir karma beni * daha mutlu eder. ;-) Yardım etmek ya da sizi teşvik etmek için yapabileceğim bir şey varsa bana bildirin. Şu an için StackExchange profilindeki e-posta adresine göz kulak olacağım. –

5

bu her durumda (eski sürümlerini/farklı sistemler) çalışır ama bu bilgi bulmak mümkün olsaydı ben bilmiyorum less --version kullanarak:

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 

Yani ... GNU düzenli ifade sözdizimi var

Ve

var --with-regex=pcre ile yeni bir sürümünü derlemek sonra

kontrol için crw için
less 481 (PCRE regular expressions) 
... 

Güncelleme

teşekkürler. Bu çözüm, sürüme özgü olarak görünüyor. Mevcut kaynak kodunu greenwoodsoftware (Linux'ta) derledikten sonra, 'un'un 436 sürümleri (25 Temmuz 2009'da yayınlanmıştır) ve daha önceki sürümler için çalışmadığını fark ettim. En az 451 (4 Eylül 2012'de yayınlanmıştır) ve sonrasında çalışmaya başlar. (Bunlar arasındaki sürümler indirilemedi).

+0

Vay, burnumuzun altında. Bunun her zaman geçerli olduğunu doğrulamanın bir yolu varsa, bunu 'kabul edilen' cevabı işaretlemeliyim. –

+2

Maalesef, dünyaya inandığımdan daha karmaşık olduğunu buldum ... Yukarıdaki güncellemeye bakın. – flyingfinger

0

soruya verilen cevap Solaris 10 benim durumunu ele vermedi less --version çıktısını gözlemlemek - İlk iki satır okuyun:

less 436 
Copyright (C) 1984-2009 Mark Nudelman 

Dinamik bağımlılıkları listesinde bariz regex kütüphanesini göremiyorum :

$ 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 birden regex arayüzleri kütüphanede tarafından sunulmaktadır olduğunu gösterir: regcmp, re_comp ve regcomp. Bu regcomp regex derleyici işleve bir bağlantı @ hek2mgl gelen cevap daha sonra README metin ise

$ 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 

: ikili karşı elfdump çalıştırarak

, ben sembolü regcomp başvurular görebilirsiniz Bu less ikili POSIX regexes (veya ikili olarak derlenmiş ise Spencer V8 regexes) kullanabilir? regcomp(3C) için

adam sayfası okur:

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

less aramalarla deneme, ben ters eğik çizgi olmadan çalışır {...} regex tekrarlama operatörü kaçar tesbit ettik. Sistemimde regex(5) için manpage, bunu Genişletilmiş Normal İfade (ERE) sözdizimi olarak tanımlar.

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