regex - solo - probar expresiones regulares
¿Qué es ''la biblioteca de expresiones regulares suministrada por[mi] sistema''? (3)
Es un parámetro de tiempo de compilación. El script ./configure de less conoce el with-regex=LIB
.
Esta es una cita de README del paquete 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).
Por lo que necesitarías saber cuánto menos fue ''./configurado''. He investigado esto en Debian / Ubuntu. Utilizan el POSIX regex lib.
Todavía estoy buscando una forma de detectarlo dinámicamente mediante un script ... :)
Actualización: lo único que he logrado hasta ahora fue detectar si menos usa expresiones regulares de PCRE o no. Si se configuró menos utilizando --with-regex=pcre
, se vincula con la biblioteca compartida 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
La página del manual para la utilidad menos GNU dice lo siguiente sobre la búsqueda:
/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.
Uso menos en todo tipo de sistemas: mi computadora portátil personal de Ubuntu, mi servidor CentOS en la nube, bajo Cygwin en el trabajo, etc. Sigo queriendo hacer cosas como miradas negativas y otras cosas sofisticadas, pero no sé qué regex sintaxis a utilizar. ¿Cómo me entero?
La respuesta sugerida para observar la salida de less --version
no abordó mi situación en Solaris 10: las dos primeras líneas dicen:
less 436
Copyright (C) 1984-2009 Mark Nudelman
No puedo ver una biblioteca de expresiones regulares obvia en la lista de dependencias dinámicas:
$ 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 que la biblioteca ofrece múltiples interfaces regex: regcmp
, re_comp
y regcomp
.
Al ejecutar elfdump
contra el binario, puedo ver referencias al símbolo 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
Si este es un enlace a la función del compilador regex regex, entonces el texto README en la respuesta de @ hek2mgl sugiere que este binario less
podría usar expresiones regulares POSIX (o expresiones regulares Spencer V8, ¿compilado en el binario?).
La página del regcomp(3C)
para regcomp(3C)
lee:
DESCRIPTION
These functions interpret basic and extended regular expres-
sions (described on the regex(5) manual page).
Experimentando con búsquedas en less
, descubrí que el operador de repetición de expresiones regulares {...}
funciona sin escapes de barra invertida. La página de regex(5)
de regex(5)
en mi sistema define esto como una sintaxis de Expresión Regular Extendida (ERE).
Por último, he encontrado appendix descriptions interesantes de las interfaces de varios motores de expresiones regulares, que se resumen a continuación:
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()
No sé si esto funciona en todos los casos (versiones anteriores / sistemas diferentes) pero pude encontrar esta información usando 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
Así que es la sintaxis de expresiones regulares de GNU ...
Y después de compilar una versión más reciente con --with-regex=pcre
obtuve
less 481 (PCRE regular expressions)
...
Actualizar
Gracias a crw por comprobar. Esta solución parece ser específica de la versión . Después de compilar el código fuente disponible en el greenwoodsoftware (en Linux), descubrí que no funciona para las versiones 436 (lanzadas el 25 de julio de 2009) y anteriores. Comienza a funcionar al menos 451 (lanzado el 4 de septiembre de 2012) y más tarde. (Las versiones intermedias no estaban disponibles para descargar).