l'utile risposta di rici spiega bene il problema con l'approccio originale.
Tuttavia, c'è un'altra cosa degna di nota:
man
l'output di contiene caratteri di controllo della formattazione , che interferiscono con le ricerche di testo .
Se passi a col -b
prima della ricerca , questi caratteri di controllo vengono rimossi - nota l'effetto collaterale che anche i risultati della ricerca saranno in testo semplice.
Tuttavia, grep
non è lo strumento adatto per questo lavoro; Suggerisco di usare awk
come segue per ottenere la descrizione di -O
:
man gcc | col -b | awk -v RS= '/^\s+-O\n/'
RS=
(un separatore di record di input vuoto) è un linguaggio awk che suddivide l'input in blocchi di righe non vuote, quindi la corrispondenza dell'opzione all'inizio di tale blocco assicura che tutte le righe che comprendono la descrizione dell'opzione vengono restituiti.
Se hai un awk
di sole funzionalità POSIX come BSD/OSX awk
, utilizza questa versione:
man gcc | col -b | awk -v RS= '/^[[:blank:]]+-O\n/'
Ovviamente, un tale comando è un po' macchinoso da digitare, quindi trova generic bash
funzione manopt
sotto, che restituisce la descrizione dell'opzione specificata per il comando specificato dal suo man
pagina . (Possono esserci falsi positivi e negativi, ma nel complesso funziona abbastanza bene.)
Esempi:
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
funzione manopt()
- posto in ~/.bashrc
, ad esempio:
# 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
implementazione di manopt()
:
Contributo di 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
Sospetto che tu non abbia effettivamente usato grep $'-O\n'
, ma piuttosto qualche flag riconosciuto da grep
.
Dal punto di vista di grep, stai semplicemente passando un argomento, e quell'argomento inizia con un -
quindi sarà interpretato come un'opzione. Devi fare qualcosa come grep -- -O$
per contrassegnare esplicitamente la fine dell'elenco di opzioni, o grep -e -O$
per contrassegnare in modo esplicito il modello come tale. In ogni caso, non puoi includere una nuova riga in un modello perché i modelli grep sono in realtà elenchi di modelli separati da caratteri di nuova riga, quindi l'argomento $'foo\n'
è in realtà due modelli, foo
e la stringa vuota, e la stringa vuota corrisponderà a ogni riga.
Forse hai cercato la bandiera -e
dal momento che prende uno schema come argomento e dandogli una nuova riga come argomento farà sì che grep trovi ogni riga nell'intero file.
Per la maggior parte dei programmi GNU, come gcc, potresti trovare info
interfaccia più facile da navigare, poiché include collegamenti di riferimento, sommari e persino indici. Il info gcc
document include un indice di opzioni, che è molto utile. In alcune distribuzioni Linux, e in qualche modo sorprendentemente dato che si chiamano distribuzioni GNU/linux, è necessario installare separatamente info
packages sebbene man
i file vengono distribuiti con il software di base. Il pacchetto debian/ubuntu contenente gcc info
file si chiama gcc-doc
, Per esempio. (L'uso del -doc
suffisso al nome del pacchetto è abbastanza comune.)
Nel caso di gcc
puoi trovare rapidamente un'opzione usando un comando come:
info gcc "option index" O
o
info gcc --index-search=funroll-loops
Per i programmi con meno opzioni, di solito è sufficiente utilizzare -O
di info opzione:
info -O gawk