rici の役立つ回答は、元のアプローチの問題をよく説明しています。
ただし、言及する価値のあることがもう 1 つあります。
man
の出力に 書式制御文字 が含まれています 、テキスト検索を妨げます .
col -b
にパイプする場合 検索する前に 、これらの制御文字は削除されます - 検索結果もプレーンテキストになるという副作用に注意してください。
ただし、grep
この仕事に適したツールではありません。 awk
を使用することをお勧めします -O
の記述を取得するには、次のようにします。 :
man gcc | col -b | awk -v RS= '/^\s+-O\n/'
RS=
(空の入力レコード区切り文字) は、入力を空でない行のブロックに分割する awk のイディオムです。そのため、そのようなブロックの先頭にあるオプションを一致させることで、オプションの説明を構成するすべての行エム> 返されます。
POSIX 機能のみの awk
がある場合 BSD/OSX awk
など 、このバージョンを使用してください:
man gcc | col -b | awk -v RS= '/^[[:blank:]]+-O\n/'
明らかに、このようなコマンドは入力するのがやや面倒なので、generic 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 (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:]]|$)"'
}
fish
manopt()
の実装 :
Ivan Aracki による寄稿。
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
grep $'-O\n'
を実際に使用していないのではないかと思います 、むしろ grep
によって認識される何らかのフラグ .
grep の観点からは、引数を渡すだけで、その引数は -
で始まります したがって、オプションとして解釈されます。 grep -- -O$
のようなことをする必要があります オプションのリストの最後に明示的にフラグを立てる、または grep -e -O$
パターンをパターンとして明示的にフラグ付けします。いずれにしても、grep パターンは実際には改行文字で区切られたパターンのリストであるため、パターンに改行を含めることはできません。したがって、引数 $'foo\n'
foo
の 2 つのパターンがあります。 と空の文字列、および空の文字列はすべての行に一致します。
おそらく、フラグ -e
を検索しました これは引数としてパターンを取り、引数として改行を与えると、grep がファイル全体のすべての行を検索するようになるためです。
gcc などのほとんどの GNU プログラムでは、info
が見つかる場合があります。 参照リンク、目次、さらには索引が含まれているため、ナビゲートしやすいインターフェイスです。 info gcc
ドキュメントにはオプションのインデックスが含まれており、非常に便利です。一部の Linux ディストリビューションでは、GNU/Linux ディストリビューションと自称しているため、驚くべきことに、info
を個別にインストールする必要があります。 man
でもパッケージ ファイルはベース ソフトウェアと共に配布されます。 gcc info
を含む debian/ubuntu パッケージ ファイルは gcc-doc
と呼ばれます 、 例えば。 (-doc
の使用 パッケージ名に接尾辞を付けるのは非常に一般的です。)
gcc
の場合 次のようなコマンドを使用して、オプションをすばやく見つけることができます:
info gcc "option index" O
または
info gcc --index-search=funroll-loops
オプションが少ないプログラムの場合、通常は info の -O
を使用するだけで十分です。 オプション:
info -O gawk