我正在尝试找到一个命令来搜索所有手册页中包含连字符的模式。
我查看了man man
,发现了以下 3 个选项:
-K
,--global-apropos
在所有手册页中搜索文本。这是一种蛮力搜索,可能需要一些时间;如果可以,您应该指定一个部分以减少需要搜索的页面数。
--regex
如果使用该选项,搜索词可能是简单的字符串(默认)或正则表达式。
-w
,--where
,--path
,--location
实际上并不显示手册页,而是打印将被格式化的源 nroff 文件的位置。
-S list
,-s list
,t--sections=list
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
并且这 2 个联机帮助页 ( 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)
^^^^^^^
是否可以在手册页中搜索包含连字符的模式?
man -K
搜索手册页的源代码,而不是它们呈现的形式(由 显示man
)。连字符已编码\-
,因此您需要搜索:是的,这是相当模糊的。手册页在选项的
man
描述中提到,-K
但正确使用它涉及了解您正在搜索的文本的源表示。