Man

如何在手冊頁中搜尋包含連字元的模式?

  • October 22, 2018

我正在嘗試找到一個命令來搜尋所有手冊頁中包含連字元的模式。

我查看了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-linesregex替換單詞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 -s1 -Kw 'mark\-mo'

是的,這是相當模糊的。手冊頁在選項man描述中提到,-K

請注意,這會搜尋手冊頁的來源,而不是呈現的文本,因此可能會由於源文件中的註釋等原因而包含誤報。搜尋呈現的文本會慢得多。

但正確使用它涉及了解您正在搜尋的文本的源表示。

引用自:https://unix.stackexchange.com/questions/477084