15

マンページで特定のフラグを見つける方法を考え出そうとしています。通常、何かを検索するには「/」を入力し、その後に「-Werror」などを入力して特定のフラグを見つけます。問題は、テキスト内にフラグへの参照がたくさんあるマンページ (gcc が今私を動かしているものです) があるということです。

それほど大したことではありませんが、もう少しうまくやれるかもしれません。「-O\n」のようなものを探すことを考えましたが、うまくいきませんでした (おそらく man プログラムが C エスケープを使用していないためでしょうか? man gcc | grep $'-O\n')ドル記号が前に付いた引用符付きの文字列は、bash に一般的な C エスケープを解釈させます... 機能しませんでした。grep はマンページ全体をエコーし​​ました。

それが私をここに連れてきた理由です:なぜですか?というか、できますか?

4

8 に答える 8

9

rici の役立つ回答は、元のアプローチの問題をよく説明しています。

ただし、言及する価値のある別のことがあります。

manの出力には書式制御文字が含まれており、テキスト検索の妨げになります

検索する前に にパイプするとcol -b、これらの制御文字が削除されます。検索結果もプレーンテキストになるという副作用に注意してください。

ただし、grepこの仕事に適したツールではありません。awkの説明を取得するには、次のように使用することをお勧めし-Oます。

man gcc | col -b | awk -v RS= '/^\s+-O\n/'
  • RS=(空の入力レコード区切り文字) は、入力を空でない行のブロックに分割する awk のイディオムであるため、そのようなブロックの先頭でオプションを照合すると、オプションの説明を構成するすべての行が返されます。

awkBSD/OSX などの POSIX 機能のみ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 (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
于 2014-07-26T04:21:52.030 に答える
5

実際には を使用していなかったと思われますがgrep $'-O\n'、 によって認識されるフラグgrepです。

grep の観点からは、引数を渡すだけで、その引数は a で始まる-ため、オプションとして解釈されます。grep -- -O$オプションのリストの最後に明示的にフラグを立てる、またはgrep -e -O$パターンにパターンとして明示的にフラグを立てるなどのことをする必要があります。いずれにしても、grep パターンは実際には改行文字で区切られたパターンのリストであるため、パターンに改行を含めることはできません。したがって、引数$'foo\n'は実際には 2 つのパターンfooと空の文字列であり、空の文字列はすべての行に一致します。

-eフラグは引数としてパターンを取り、改行を引数として指定すると、grep がファイル全体のすべての行を検索するため、フラグを検索した可能性があります。

gcc などのほとんどの GNU プログラムでinfoは、参照リンク、目次、さらにはインデックスが含まれているため、インターフェースをナビゲートしやすいと感じるかもしれません。info gccドキュメントにはオプションの索引が含まれており、非常に便利です。一部の Linux ディストリビューションでは、GNU/Linux ディストリビューションと自称しているため、驚くべきことに、ファイルはベース ソフトウェアと共に配布されますがinfo、パッケージを個別にインストールする必要があります。たとえば、gccファイルmanを含む debian/ubuntu パッケージは と呼ばれます。(パッケージ名にサフィックスを使用することは非常に一般的です。)infogcc-doc-doc

次のgccようなコマンドを使用して、オプションをすばやく見つけることができます。

info gcc "option index" O

また

info gcc --index-search=funroll-loops

-Oオプションが少ないプログラムの場合、通常は info のオプションを使用するだけで十分です。

info -O gawk
于 2013-10-05T15:05:38.673 に答える
1

問題は、「man」がページャー、通常は「less」を使用することです。そのマンページには次のように記載されています。

/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' の問題はまだ謎です。

于 2013-10-05T14:37:16.850 に答える
1

私は以下を使用します:

man some_command | col -b | grep -A5 -- 'your_request'

例:

  • man man | col -b | grep -A5 -- '-K'

  • man grep | col -b | grep -A5 -- '-e patt'

エイリアスを作成できます。

于 2019-01-22T14:28:06.480 に答える
0

man環境変数に基づいています(EDITOR私が間違っていなければ)。これをmore(デフォルト値) からたとえば に変更するemacsと、使用中にシステムでセッションが開かれ、好きなように検索および閲覧できるようになります。manemacs

于 2018-07-03T14:42:08.147 に答える