Užitečná odpověď rici vysvětluje problém s původním přístupem dobře.
Za zmínku však stojí ještě jedna věc:
man
Výstup 's obsahuje řídicí znaky formátování , které zasahují do textového vyhledávání .
Pokud potrubím do col -b
před hledáním , tyto řídicí znaky jsou odstraněny – vedlejší efekt je, že výsledky vyhledávání budou také jako prostý text.
Nicméně grep
není pro tuto práci tím správným nástrojem; Doporučuji použít awk
následujícím způsobem získáte popis -O
:
man gcc | col -b | awk -v RS= '/^\s+-O\n/'
RS=
(prázdný oddělovač vstupu a záznamu) je awk idiom, který rozděluje vstup do bloků neprázdných řádků, takže porovnání volby na začátku takového bloku zajistí, že všechny řádky obsahující popis možnosti jsou vráceny.
Pokud máte awk
pouze s funkcemi POSIX jako je BSD/OSX awk
, použijte tuto verzi:
man gcc | col -b | awk -v RS= '/^[[:blank:]]+-O\n/'
Je zřejmé, že psaní takového příkazu je poněkud těžkopádné, proto najděte generický bash
funkce manopt
níže, což vrátí popis zadané možnosti pro zadaný příkaz z jeho man
stránka . (Můžou existovat falešně pozitivní a negativní, ale celkově to funguje docela dobře.)
Příklady:
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
funkce manopt()
- umístěte do ~/.bashrc
, například:
# 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
implementace manopt()
:
Přispěl 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
Mám podezření, že jste ve skutečnosti nepoužili grep $'-O\n'
, ale spíše nějaký příznak rozpoznávaný grep
.
Z pohledu grepu jednoduše předáváte argument a tento argument začíná -
takže to bude interpretováno jako možnost. Musíte udělat něco jako grep -- -O$
explicitně označit konec seznamu možností, nebo grep -e -O$
explicitně označit vzor jako vzor. V žádném případě nemůžete do vzoru zahrnout nový řádek, protože vzory grep jsou ve skutečnosti seznamy vzorů oddělené znaky nového řádku, takže argument $'foo\n'
jsou ve skutečnosti dva vzory, foo
a prázdný řetězec a prázdný řetězec bude odpovídat každému řádku.
Možná jste hledali příznak -e
protože to bere vzor jako argument a když mu jako argument přidáte nový řádek, grep najde každý řádek v celém souboru.
U většiny programů GNU, jako je gcc, můžete najít info
jednodušší navigace, protože obsahuje referenční odkazy, obsahy a dokonce i indexy. info gcc
dokument obsahuje rejstřík možností, což je velmi užitečné. V některých linuxových distribucích a poněkud překvapivě, protože se nazývají distribucemi GNU/linux, je nutné samostatně nainstalovat info
balíčky, ačkoli man
soubory jsou distribuovány se základním softwarem. Balíček debian/ubuntu obsahující gcc info
souborů se nazývá gcc-doc
, například. (Použití -doc
přípona názvu balíčku je docela běžná.)
V případě gcc
můžete rychle najít možnost pomocí příkazu jako:
info gcc "option index" O
nebo
info gcc --index-search=funroll-loops
U programů s méně možnostmi je obvykle dost dobré použít info -O
možnost:
info -O gawk