我试图想出一个方法来在手册页中find特定的标志。 通常,我input“/”search某个内容,然后input“-Werror”来查找特定的标志。 事情是,虽然有人页(海湾合作委员会是现在激励我的),有很多引用标志的文字,所以有很多事件。
这不是什么大不了的事情,但也许可以做得更好一点。 我想找个'-O \ n'这样的东西,但是没有用(可能是因为man程序没有使用C转义符?)然后我尝试了一些类似于man gcc | grep $'-O\n'
man gcc | grep $'-O\n'
,因为我记得前面有一个美元符号的单引号string有bash解释常见的C逃脱…这是行不通的,grep回应整个手册页。
这就是我在这里带来的:为什么? 或者说,这可以做到吗?
我怀疑你实际上没有使用grep $'-O\n'
,而是使用grep $'-O\n'
识别的一些标志。
从grep的角度来看,你只是简单地传递一个参数,而这个参数是以a开头的-
所以它将被解释为一个选项。 你需要做一些像grep -- -O$
来显式标记选项列表的末尾,或者grep -e -O$
来明确地标记模式作为模式。 无论如何,你不能在模式中包含换行符,因为grep模式实际上是由换行符分隔的模式列表,所以参数$'foo\n'
实际上是两个模式, foo
和空字符串,空字符串将会匹配每一行。
也许你搜索了标志-e
因为它把一个模式作为参数,给它一个换行符作为参数将导致grep找到整个文件中的每一行。
对于大多数GNU程序,比如gcc,你可能会发现info
界面更容易浏览,因为它包含了引用链接,目录,甚至索引。 info gcc
文件包含一个选项索引,这非常有用。 在一些Linux发行版中,有些令人惊讶的是,因为他们自称GNU / linux发行版,尽管man
文件是与基本软件一起发布的,但仍然需要单独安装info
包。 例如,包含gcc info
文件的debian / ubuntu包叫做gcc-doc
。 (将-doc
后缀用于包名非常普遍。)
在gcc
的情况下,你可以使用如下命令快速找到一个选项:
info gcc "option index" O
要么
info gcc --index-search=funroll-loops
对于选项较少的程序,通常使用info的-O
选项就足够了:
info -O gawk
rici的有用答案很好地解释了原始方法的问题。
不过,还有一件事值得一提:
man
的输出包含格式化控制字符 ,这会干扰文本搜索 。
如果在搜索前将管道输送到col -b
,则会删除这些控制字符 – 注意搜索结果也是纯文本的副作用。
但是, grep
并不适合这项工作。 我建议使用awk
如下获取-O
的描述:
man gcc | col -b | awk -v RS= '/^\s+-O\n/'
RS=
(一个空的输入记录分隔符)是一个awk惯例,将输入分成非空行块,所以在这个块的开头匹配选项可以确保所有包含该选项描述的行被返回。 如果你有一个POSIX-features-only awk
如BSD / OSX awk
,使用这个版本:
man gcc | col -b | awk -v RS= '/^[[:blank:]]+-O\n/'
很明显,这样的命令有点麻烦,所以这里是通用的bash
函数manopt
,它从man
页返回指定命令的指定选项的描述 。 (可能会有误报,但是总的来说它工作的很好。)
例子:
manopt gcc O # search `man gcc` for description of `-O` manopt grep regexp # search `man grep` for description of `--regexp` manopt find '-exec.*' # search `man find` for all actions _starting with_ '-exec'
bash
函数manopt()
– 放在~/.bashrc
,例如: # SYNOPSIS # manopt command opt # # DESCRIPTION # Returns the portion of COMMAND's man page describing option OPT. # Note: Result is plain text - formatting is lost. # # OPT may be a short option (eg, -F) or long option (eg, --fixed-strings); # specifying the preceding '-' or '--' is OPTIONAL - UNLESS with long option # names preceded only by *1* '-', such as the actions for the `find` command. # # Matching is exact by default; to turn on prefix matching for long options, # quote the prefix and append '.*', eg: `manopt find '-exec.*'` finds # both '-exec' and 'execdir'. # # EXAMPLES # manopt ls l # same as: manopt ls -l # manopt sort reverse # same as: manopt sort --reverse # manopt find -print # MUST prefix with '-' here. # manopt find '-exec.*' # find options *starting* with '-exec' manopt() { local cmd=$1 opt=$2 [[ $opt == -* ]] || { (( ${#opt} == 1 )) && opt="-$opt" || opt="--$opt"; } man "$cmd" | col -b | awk -v opt="$opt" -v RS= '$0 ~ "(^|,)[[:blank:]]+" opt "([[:punct:][:space:]]|$)"' }
问题是“人”使用寻呼机,通常是“少”,其手册中指出:
/pattern Search forward in the file for the N-th line containing the pattern. N defaults to 1. The pattern is a regular expression, as recognized by the regular expression library supplied by your system. The search starts at the first line displayed (but see the -a and -j options, which change this).
所以,人们可以尝试在手册页中查找“-O $”,以找到一个独立存在的旗帜。 虽然在同一行中标记后面跟着文本是很常见的,所以这是不能保证的。
grep和$' – O \ n'的问题仍然是一个谜。
man gcc | grep "\-"
这工作得很好,因为它显示所有的标志,通常不会更多。
编辑:我注意到我没有完全回答你的问题,但我希望我的建议可以被视为一个不错的选择。