fer*_*raz 8 unix linux bash sh less-unix
我正试图想出一种在人工页面中找到特定标志的方法.通常,我输入'/'来搜索某些内容,然后输入类似'-Werror'的内容来查找特定标记.事情是,虽然有man-pages(gcc是我现在激励我的那个),它们在文本中有很多对标志的引用,所以有很多事情发生.
这不是什么大不了的事,但也许可以做得更好.我想找'-O \n'之类的东西,但它不起作用(可能因为man程序不使用C转义?)然后我尝试了类似的东西man gcc | grep $'-O\n',因为我有点回忆一下 -带引号的字符串前面有一个美元符号有bash解释常见的C转义...它没有用,grep回应了整个man-page.
这就是我带到这里的原因:为什么?或者更确切地说,这可以做到吗?
rici的有用答案很好地解释了原始方法的问题.
但是,还有一件值得一提的事:
man的输出包含格式控制字符,这会干扰文本搜索.
如果在搜索之前输入管道col -b,则会删除这些控制字符 - 请注意搜索结果也是纯文本的副作用.
但是,grep这项工作不适合; 我建议使用awk如下获取描述-O:
man gcc | col -b | awk -v RS= '/^\s+-O\n/'
Run Code Online (Sandbox Code Playgroud)
RS=(空的输入记录分隔符)是一个awk习惯用法,它将输入分解为非空行的块,因此匹配此类块开头的选项可确保返回包含该选项描述的所有行.如果您有POSIX功能,awk例如BSD/OSX awk,请使用此版本:
man gcc | col -b | awk -v RS= '/^[[:blank:]]+-O\n/'
Run Code Online (Sandbox Code Playgroud)
显然,这样的命令输入有点麻烦,所以找下面的泛型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'
Run Code Online (Sandbox Code Playgroud)
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 (e.g., -F) or long option (e.g., --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 '.*', e.g.: `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:]]|$)"'
}
Run Code Online (Sandbox Code Playgroud)
fish执行manopt():function manopt
set -l cmd $argv[1]
set -l opt $argv[2]
if not echo $opt | grep '^-' >/dev/null
if [ (string length $opt) = 1 ]
set opt "-$opt"
else
set opt "--$opt"
end
end
man "$cmd" | col -b | awk -v opt="$opt" -v RS= '$0 ~ "(^|,)[[:blank:]]+" opt "([[:punct:][:space:]]|$)"'
end
Run Code Online (Sandbox Code Playgroud)
我怀疑您实际上并没有使用grep $'-O\n',而是使用了grep.
从 grep 的角度来看,您只是传递一个参数,该参数以 a 开头,-因此它将被解释为一个选项。您需要执行一些操作,例如grep -- -O$显式标记选项列表的末尾,或grep -e -O$显式地将模式标记为模式。在任何情况下,您都不能在模式中包含换行符,因为 grep 模式实际上是由换行符分隔的模式列表,因此参数$'foo\n'实际上是两个模式foo和空字符串,而空字符串将匹配每一行。
也许您搜索了标志,-e因为它将模式作为参数,并为其提供换行符作为参数将导致 grep 查找整个文件中的每一行。
对于大多数 GNU 程序,例如 gcc,您可能会发现该info界面更易于浏览,因为它包括参考链接、目录甚至索引。该info gcc文档包含一个选项索引,非常有用。在一些 linux 发行版中,有些令人惊讶的是,因为它们称自己为 GNU/linux 发行版,info尽管man文件与基本软件一起分发,但有必要单独安装软件包。例如,包含 gccinfo文件的 debian/ubuntu 包称为gcc-doc。(-doc包名后缀的使用很常见。)
在这种情况下,gcc您可以使用以下命令快速找到一个选项:
info gcc "option index" O
Run Code Online (Sandbox Code Playgroud)
或者
info gcc --index-search=funroll-loops
Run Code Online (Sandbox Code Playgroud)
对于选项较少的程序,通常使用 info 的-O选项就足够了:
info -O gawk
Run Code Online (Sandbox Code Playgroud)