在一个命令的man页中,使用“/”可以查找字符串,但如果要使用扩展正则元字符时 \{m,n\} 。如何操作?
例如 man awk
如何查找以空白字符开头的 for循环语句的说明
如何在在man命令中,使用扩展正则查找字符串?
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
- s1978256
- 帖子: 55
- 注册时间: 2015-08-24 22:17
- 系统: ubuntu20.04.4
- astolia
- 论坛版主
- 帖子: 6436
- 注册时间: 2008-09-18 13:11
Re: 如何在在man命令中,使用扩展正则查找字符串?
首先纠正一个概念。man命令本身只负责解析manpage文档,具体的显示是交给pager的
在ubuntu上,默认情况下的pager是less也可以用-P参数指定其他的pager。比如man -P cat awk。就是直接用cat输出了
所以说,那些查找功能,实际上是由pager程序提供的。对默认的less来讲,它的/搜索功能所用的正则库是用的系统中已有的库
里面就写明了用的是gnu库里提供的正则功能
可以看到当用gnu库的正则实现的时候,使用的正则语法已经是扩展正则表达式了。
所以直接按照扩展正则的写法写就是了
你的\{m,n\}这种写法是基本正则表达式中的写法,扩展正则直接写{m,n}。两者差异可以看man grep中Basic vs Extended Regular Expressions一段
在ubuntu上,默认情况下的pager是less
代码: 全选
update-alternatives --display pager
所以说,那些查找功能,实际上是由pager程序提供的。对默认的less来讲,它的/搜索功能所用的正则库是用的系统中已有的库
具体是哪个库,可以通过编译时的日志找到。比如对于64位的18.04系统,日志在 https://launchpadlibrarian.net/34778790 ... ING.txt.gz/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).
里面就写明了用的是gnu库里提供的正则功能
gnu库的正则功能可以选择不同的语法,要知道less用的哪个只能查源代码了regular expression library: gnu
代码: 全选
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
所以直接按照扩展正则的写法写就是了
代码: 全选
/\bfor\s+\(
代码: 全选
Basic vs Extended Regular Expressions
In basic regular expressions the meta-characters ?, +, {, |, (, and )
lose their special meaning; instead use the backslashed versions \?,
\+, \{, \|, \(, and \).