GNU的 less 实用程序的 man 页面说明了以下关于搜索的内容:
/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.
我在所有类型的系统上使用 less :我的个人Ubuntu笔记本电脑,我的CentOS云服务器,Cygwin在工作中等等。我一直想做一些事情,比如负面预测和其他幻想东西,但我不知道使用什么正则表达式语法。我怎么知道?
答案 0 :(得分:9)
这是一个编译时参数。较少的./configure脚本知道with-regex=LIB
param。
这是来自上游包的自述文件的引用:
- 与正则表达式= 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正则表达式lib。
我仍然在寻找一种通过脚本动态检测它的方法......:)
更新:到目前为止我唯一能做的就是检测是否少用pcre正则表达式。如果使用--with-regex=pcre
配置less,则它与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
答案 1 :(得分: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日发布)和更晚。 (这些版本之间的版本无法下载)。
答案 2 :(得分: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
表示库提供了多个正则表达式接口: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
正则表达式编译器函数的链接,则来自@ 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)语法。
最后,我发现了各种正则表达式引擎的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()