为什么“man -awK”可能包含与搜索词不匹配的结果?

为什么“man -awK”可能包含与搜索词不匹配的结果?

例子:

man -awK "typeset"

这已通过管道确认grep

search=typeset
man -awK -- "$search" | xargs -I {} sh -c "echo '{}'
    man --no-hyphenation --no-justification -- {} | grep -iF -- '$search'"

结果:

/usr/share/man/man1/lcf.1.gz
/usr/share/man/man1/memusagestat.1.gz
/usr/share/man/man1/mtrace.1.gz
/usr/share/man/man1/nm-applet.1.gz
/usr/share/man/man1/nm-connection-editor.1.gz
/usr/share/man/man1/nroff.1.gz
       格罗夫_排版TER 环境变量或 -T 命令行选项
       格罗夫_排版TER
              和格罗夫_排版TER 未设置。
/usr/share/man/man1/tfmtodit.1.gz
       为了学好数学排版ting、groff 需要字体公制
/usr/share/man/man1/ptx.1.gz
       -t,--排版-模式-未实施-
/usr/share/man/man1/chrt.1.gz
/usr/share/man/man1/taskset.1.gz
/usr/share/man/man1/chem.1.gz
              为了排版化学结构图 [CSTR #122]。
       cm.bell-labs.com/netlib/排版ting/chem.gz⟩。它的 README 文件被使用
       排版化学结构图 [CSTR #122] ⟨http://
/usr/share/man/man1/chacl.1.gz

请注意,前五个结果实际上根本不包含“typeset”。其他搜索词的行为类似。

我正在运行 Ubuntu 20.04.4 LTS (5.15.0-43-generic) 和 man 2.9.1。这似乎也是 macOS 12.5 和 man 1.6g 上的一个问题,这让我想知道我是否做错了什么?

答案1

man -K搜索所有内容,包括手册页源文件中的注释。

该字符串typeset作为 GNU GPL 许可证头的一部分出现在许多 GNU 和其他 GNU-GPL 许可的程序中。

.\" 这是免费文档;您可以重新分发它和/或
.\”根据 GNU 通用公共许可证的条款将其修改为
.\”由自由软件基金会发布;版本 2
.\”许可证,或(由您选择)任何更高版本。
.\”
.\" GNU 通用公共许可证对“目标代码”的引用
.\”和“可执行文件”将被解释为任何
.\”文档格式或排版廷系统,包括
.\”中间和打印输出。
……

我没有方便的解决方法可以提供。但手册页往往不会有很多注释,因此问题仅限于几句话。

答案2

在我的乌班图系统,问题是什么吉尔斯在同一页的回答详细信息。我接受他的回答,因为他在这方面提供了他的专业知识。谢谢你,吉尔斯!

在我的苹果系统系统,它是因为管道式手册页在文档的搜索词中仍然包含控制字符,正如 所确认的那样man man | sed -n l

一种解决方案是首先使用 过滤掉控制字符col -b,这会删除格式:

search=typeset
man -awK -- "$search" | xargs -I {} sh -c "echo '{}'
    man --no-hyphenation --no-justification -- {} | \
    col -b | grep -iF --color=always -- '$search'"

另一个解决方案是使用MAN_KEEP_FORMATTING=1并通过管道传递到ul,这会保留格式:

search=typeset
man -awK -- "$search" | xargs -I {} sh -c "echo '{}'
    MAN_KEEP_FORMATTING=1 man --no-hyphenation --no-justification -- {} | \
    ul | grep -iF --color=always -- '$search'"

(有关解决方案的更多详细信息ul:指定MAN_KEEP_FORMATTING=1— 如 — 所示man man— 对于 Ubuntu 20.04.4 似乎没有必要,但它似乎对于 macOS 是必需的,并且对于其他操作系统也可能是必需的,因此只需包含它即可确定。另一种解决方案详细描述为斯蒂芬·查泽拉斯在我的相关问题中,但该解决方案仅适用于 Ubuntu,不适用于 macOS。)

无论哪种情况,唯一可靠的解决方案似乎是使用 grep 执行第二遍过滤:

* 假设您的搜索词不包含多个跨行的单词(很可能只是一行末尾的一个单词,以及下一行开头的下一个单词)。如果是这样,也许可以使用过滤器pcre2grep -M 'search\s+term代替。

search=typeset
man -awK -- "$search" | \
    xargs -I {} sh -c "man --no-hyphenation --no-justification -- {} | \
    col -b | grep -qiF -- '$search' && printf '%s\n' '{}'"

如果您想要一个更详细的代码解决方案来搜索手册页并突出显示结果,同时保留手册页格式(颜色/等),请参考我的相关问题

相关内容