Что такое библиотека регулярных выражений, предоставляемая [моей] системой?
В справочной странице для утилиты, не содержащей GNU, говорится о следующем:
/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.
Я использую меньше на всех видах систем: мой личный ноутбук Ubuntu, мой облачный сервер CentOS, под Cygwin на работе и т.д. Я все время хочу делать что-то вроде негативного взгляда и других причудливых вещей, но я не знать, что использовать синтаксис regex. Как узнать?
Ответы
Ответ 1
Это параметр времени компиляции.. /configure script меньше знает параметр with-regex=LIB
.
Это цитата из README пакета upstream:
- с-регулярное выражение = 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 V8-compatible regcomp
(source is supplied with less).
Итак, вам нужно знать, как меньше было "./configured". Я исследовал это на Debian/Ubuntu. Они используют POSIX regex lib.
Я все еще ищу способ обнаружить его динамически с помощью script...:)
Обновление. Единственное, что мне удалось до сих пор, это определить, меньше ли использует регулярные выражения 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
Ответ 2
Я не знаю, работает ли это во всех случаях (более старые версии/разные системы), но я смог найти эту информацию, используя 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
Итак, это синтаксис regex GNU...
И после компиляции более новой версии с --with-regex=pcre
я получил
less 481 (PCRE regular expressions)
...
Обновление
Благодаря crw для проверки. Это решение похоже на версию. После компиляции доступного исходного кода в greenwoodsoftware (в Linux) я обнаружил, что он не работает для версий 436 (выпущен 25 июля 2009 г.) и раньше. Он начинает работать не менее 451 (выпущен 4 сентября 2012 года) и позже. (Версии между ними недоступны для загрузки).
Ответ 3
Рекомендуемый ответ на вывод less --version
не касался моей ситуации в Solaris 10 - первые две строки были прочитаны:
less 436
Copyright (C) 1984-2009 Mark Nudelman
Я не вижу явной библиотеки регулярных выражений в списке динамических зависимостей:
$ 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
указывает, что библиотека предлагает несколько интерфейсов регулярного выражения: regcmp
, re_comp
и regcomp
.
Запустив elfdump
в двоичном формате, я вижу ссылки на символ 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
Если это ссылка на функцию компилятора regcomp
regex, тогда текст README в ответе от @hek2mgl предполагает, что этот двоичный код less
может использовать регулярные выражения POSIX (или регулярные выражения Spencer V8, если они скомпилированы в двоичный файл?).
Страница руководства для regcomp(3C)
читает:
DESCRIPTION
These functions interpret basic and extended regular expres-
sions (described on the regex(5) manual page).
Экспериментируя с поисками в less
, я обнаружил, что оператор повторения регулярных выражений {...}
работает без обратных слэшей. Маска для regex(5)
в моей системе определяет это как синтаксис расширенного регулярного выражения (ERE).
Наконец, я нашел несколько интересных описаний интерфейсов различных двигателей регулярных выражений, приведенных ниже:
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()