我试图找到一个命令来搜索所有手册页中包含连字符的模式。
我查看了man man
,发现了这 3 个选项:
-K
,--global-apropos
在所有手册页中搜索文本。这是一种强力搜索,可能需要一些时间;如果可以的话,您应该指定一个部分来减少需要搜索的页面数量。搜索词可以是简单字符串(默认),也可以是正则表达式(如果
--regex
使用该选项)。
-w
,--where
,--path
,--location
实际上并不显示手册页,而是打印要格式化的源 nroff 文件的位置。
-S list
,-s list
,t--sections=list
列表是要搜索的特定于订单的手册部分的以冒号或逗号分隔的列表。该选项会覆盖
$MANSECT
环境变量。 (这种-s
拼写是为了与 System V 兼容。)
我尝试将它们组合起来搜索模式,mark-modified-lines
该模式是以下中描述的 readline 选项man bash
:
$ man -s1 -Kw mark-modified-lines
但它没有找到任何页面:
No manual entry for mark-modified-lines
该命令以代码退出16
。
我认为该命令的语法可能是错误的,但看起来并非如此,因为该命令正确地在我的系统上找到了包含以下单词的 5 个手册页guitar
:
$ man -s1 -Kw guitar
/usr/share/man/man1/ffmpeg-all.1.gz
/usr/share/man/man1/ffserver-all.1.gz
/usr/share/man/man1/ffplay-all.1.gz
/usr/share/man/man1/ffmpeg-filters.1.gz
/usr/share/man/man1/ffprobe-all.1.gz
我想也许这个词中的连字符引起了问题。在 中man bash
,我找到了该--regex
选项,描述如下:
--regex
显示其名称或描述的任何部分与每个页面参数匹配的所有页面作为正则表达式,如
apropos(1)
.由于在搜索正则表达式时通常没有合理的方法来选择“最佳”页面,因此此选项意味着-a
.
我尝试使用此选项并将该单词替换mark-modified-lines
为 regex mark.modified.lines
,其中连字符本身替换.
为应与任何字符匹配的元字符:
$ man -s1 -Kw --regex 'mark.modified.lines'
它仍然不打印任何页面,虽然我知道文本写在bash
手册页中。
.
正则表达式中的元字符似乎按预期进行了解析,因为此命令:
$ man -s1 -Kw --regex 'mark.mo'
印刷:
/usr/share/man/man1/x11perfcomp.1.gz
/usr/share/man/man1/xditview.1.gz
这两个联机帮助页 ( x11perfcomp
, xditview
) 均由正则表达式匹配mark.mo
。更具体地说,man x11perfcomp
包含这一行:
Mark Moraes wrote the original scripts to compare servers.
^^^^^^^
并man xditview
包含这一行:
Mark Moraes (University of Toronto)
^^^^^^^
但是,man -s1 -Kw --regex 'mark.mo'
不打印 bash 手册页:
/usr/share/man/man1/bash.1.gz
虽然我期望它会,因为它包含这一行:
mark-modified-lines (Off)
^^^^^^^
是否可以在手册页中搜索包含连字符的模式?
答案1
man -K
搜索手册页的源代码,而不是其呈现形式(如 所示man
)。连字符已编码\-
,因此您需要搜索:
man -s1 -Kw 'mark\-mo'
是的,这相当晦涩难懂。这man
页-K
在选项的描述中提到
请注意,这将搜索来源手册页的内容,而不是呈现的文本,因此可能会由于源文件中的注释等原因而出现误报。搜索渲染的文本会慢得多。
但正确使用它需要了解您正在搜索的文本的源表示形式。