如何在手册页中搜索包含连字符的模式?

use*_*271 11 man

我试图找到一个命令来搜索所有手册页中包含连字符的模式。

我查看了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,这是在man bash以下内容中描述的 readline 选项:

$ man -s1 -Kw mark-modified-lines
Run Code Online (Sandbox Code Playgroud)

但它没有找到任何页面:

No manual entry for mark-modified-lines
Run Code Online (Sandbox Code Playgroud)

并且命令以代码退出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
Run Code Online (Sandbox Code Playgroud)

我认为这个词中的连字符可能引起了问题。在 中man bash,我找到了--regex如下描述的选项:

--regex

显示所有页面,其名称或描述的任何部分与每个页面参数匹配作为正则表达式,如apropos(1). 由于在搜索正则表达式时通常没有合理的方法来选择“最佳”页面,因此该选项意味着-a.

我尝试使用此选项并将单词替换为mark-modified-linesregex mark.modified.lines,其中连字符本身替换为.应匹配任何字符的元字符:

$ man -s1 -Kw --regex 'mark.modified.lines'
Run Code Online (Sandbox Code Playgroud)

它仍然没有打印任何页面,而我知道文本是写在bash手册页中的。

.正则表达式中的元字符似乎按预期解析,因为此命令:

$ man -s1 -Kw --regex 'mark.mo'
Run Code Online (Sandbox Code Playgroud)

印刷:

  /usr/share/man/man1/x11perfcomp.1.gz
  /usr/share/man/man1/xditview.1.gz
Run Code Online (Sandbox Code Playgroud)

这两个联机帮助页 ( x11perfcomp, xditview) 都与正则表达式匹配mark.mo。更具体地说,man x11perfcomp包含这一行:

Mark Moraes wrote the original scripts to compare servers.
^^^^^^^
Run Code Online (Sandbox Code Playgroud)

man xditview包含这一行:

    Mark Moraes (University of Toronto)
    ^^^^^^^
Run Code Online (Sandbox Code Playgroud)

但是,man -s1 -Kw --regex 'mark.mo'不打印 bash 手册页:

/usr/share/man/man1/bash.1.gz
Run Code Online (Sandbox Code Playgroud)

虽然我期望它会,因为它包含这一行:

mark-modified-lines (Off)
^^^^^^^
Run Code Online (Sandbox Code Playgroud)

是否可以在手册页中搜索包含连字符的模式?

Ste*_*itt 15

man -K搜索手册页的源代码,而不是它们的呈现形式(如 所示man)。连字符已编码\-,因此您需要搜索:

man -s1 -Kw 'mark\-mo'
Run Code Online (Sandbox Code Playgroud)

是的,这是相当晦涩的。man手册页提到,在的描述-K选项,

请注意,这会搜索手册页的来源,而不是呈现的文本,因此可能会由于源文件中的注释等原因而包含误报。搜索呈现的文本会慢得多。

但是正确使用它涉及了解您正在搜索的文本的源代码表示。