如何在在man命令中,使用扩展正则查找字符串?

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
头像
s1978256
帖子: 55
注册时间: 2015-08-24 22:17
系统: ubuntu20.04.4

如何在在man命令中,使用扩展正则查找字符串?

#1

帖子 s1978256 » 2018-06-08 20:58

在一个命令的man页中,使用“/”可以查找字符串,但如果要使用扩展正则元字符时 \{m,n\} 。如何操作?
例如 man awk
如何查找以空白字符开头的 for循环语句的说明
头像
astolia
论坛版主
帖子: 6436
注册时间: 2008-09-18 13:11

Re: 如何在在man命令中,使用扩展正则查找字符串?

#2

帖子 astolia » 2018-06-09 11:50

首先纠正一个概念。man命令本身只负责解析manpage文档,具体的显示是交给pager的
在ubuntu上,默认情况下的pager是less

代码: 全选

update-alternatives --display pager
也可以用-P参数指定其他的pager。比如man -P cat awk。就是直接用cat输出了

所以说,那些查找功能,实际上是由pager程序提供的。对默认的less来讲,它的/搜索功能所用的正则库是用的系统中已有的库
/pattern
Search forward in the file for the N-th line containing the pat‐
tern. N defaults to 1. The pattern is a regular expression, as
recognized by the regular expression library supplied by your
system.
The search starts at the first line displayed (but see
the -a and -j options, which change this).
具体是哪个库,可以通过编译时的日志找到。比如对于64位的18.04系统,日志在 https://launchpadlibrarian.net/34778790 ... ING.txt.gz
里面就写明了用的是gnu库里提供的正则功能
regular expression library: gnu
gnu库的正则功能可以选择不同的语法,要知道less用的哪个只能查源代码了

代码: 全选

wget -q http://mirrors.aliyun.com/ubuntu/pool/main/l/less/less_487.orig.tar.gz -O- | tar -xzO less-487/pattern.c | grep -A5 -m1 HAVE_GNU_REGEX
可以看到当用gnu库的正则实现的时候,使用的正则语法已经是扩展正则表达式了。

所以直接按照扩展正则的写法写就是了

代码: 全选

/\bfor\s+\(
你的\{m,n\}这种写法是基本正则表达式中的写法,扩展正则直接写{m,n}。两者差异可以看man grep中Basic vs Extended Regular Expressions一段

代码: 全选

   Basic vs Extended Regular Expressions
       In  basic  regular expressions the meta-characters ?, +, {, |, (, and )
       lose their special meaning; instead use the  backslashed  versions  \?,
       \+, \{, \|, \(, and \).
回复