19

GNU 的less实用程序的手册页说明了以下关于搜索的内容:

/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 等。我一直想做负前瞻和其他花哨的东西,但我不知道什么正则表达式要使用的语法。我怎么知道?

4

3 回答 3

11

它是一个编译时参数。less 的 ./configure 脚本知道with-regex=LIB参数。

这是来自上游包自述文件的引用:

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

所以你需要知道'./configured'有多少。我在 Debian / Ubuntu 上对此进行了调查。他们使用 POSIX 正则表达式库。

我仍在寻找一种通过脚本动态检测它的方法...... :)


更新:到目前为止,我唯一能做的就是检测 less 是否使用 pcre 正则表达式。如果使用 less 配置--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
于 2013-02-05T00:54:07.030 回答
5

我不知道这是否适用于所有情况(旧版本/不同系统),但我能够使用以下方法找到此信息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

所以它是 GNU 正则表达式语法......

--with-regex=pcre在用我编译了一个更新的版本之后

less 481 (PCRE regular expressions)
...

更新

感谢crw的检查。这个解决方案似乎是特定于版本的。在greenwoodsoftware(Linux 中)编译可用的源代码后,我发现它不适用于版本 436(2009 年 7 月 25 日发布)及更早版本。它至少在 451(2012 年 9 月 4 日发布)及以后开始工作。(两者之间的版本不可下载)。

于 2016-07-28T23:33:25.563 回答
0

观察输出的建议答案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表示库提供了多个正则表达式接口regcmpre_compregcomp.

通过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正则表达式编译器函数的链接,那么来自@hek2mgl 的答案中的 README 文本表明该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()
于 2016-08-05T17:03:22.497 回答