Come posso richiedere una stringa che inizia con un trattino / trattino?


347

Voglio grep per la stringa che inizia con un trattino / trattino, come -Xin un file, ma lo confonde come argomento della riga di comando.

Ho provato:

grep "-X"
grep \-X
grep '-X'

Risposte:


465

Uso:

grep -- -X

Correlati: cosa significa un doppio trattino nudo? (grazie a nutty circa natty ).


57
per quelli di noi che si chiedono in questa fase cosa --significhi o faccia: unix.stackexchange.com/questions/11376/…
per natty

2
Funziona anche con The Silver Searcher (ag).
Zev Eisenberg,

Se si desidera utilizzare variabili con spazi, è necessario utilizzare qualcosa del genere:ARGS="-a -b -c" grep -- "$ARGS"
zapstar

2
@zapstar O semplicemente, grep -- "--name awesome".
Brett Widmeier,

@BrettWidmeier, sì, non avrei dovuto usare la variabile, confonde le persone.
zapstar,

57

Il trattino è un personaggio speciale in Bash, come notato su http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Quindi evadere una volta ti fa superare Bash, ma Grep ha ancora il suo significato per i trattini (fornendo opzioni).

Quindi devi davvero scappare due volte (se preferisci non usare le altre risposte menzionate). Il seguente / dovrebbe funzionare

grep \\-X
grep '\-X'
grep "\-X"

Un modo per provare come Bash passa argomenti a uno script / programma è quello di creare uno script .sh che rispecchi tutti gli argomenti. Uso uno script chiamato echo-args.sh per giocare di tanto in tanto, tutto ciò che contiene è:

echo $*

Lo invoco come:

bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"

Ti viene l'idea.


1
Non credo - è un personaggio speciale in Bash nonostante ciò che dice la guida ABS. Bash non elabora gli argomenti che iniziano con - in modo diverso da altri. Il comando o il built-in che Bash successivamente chiamerà gestirà gli argomenti che iniziano con un trattino come meglio ritiene opportuno. La maggior parte dei comandi integrati di Bash e dei comandi Linux e GNU viene gestita come terminatore di opzioni. Usa 'set -x' per vedere i comandi e gli argomenti che Bash usa prima che vengano eseguiti, ma dopo che Bash ha espanso escape, globs e parentesi graffe. Grep è un esempio confuso perché gestisce autonomamente le escape di barra rovesciata.
Noah Spurrier,

25

grep -e -X farà il trucco.


1
il mio grep non ha -e, molto strano
Mike

14
solaris per i perdenti
Mike

2
Disponibile su solaris da / usr / xpg4 / bin / grep, a proposito. Molte utilità più complete in quella directory.
pra

Funzionava con MinGW ( MinGW non supporta -P(ma questa è un'altra storia e non si applica qui)).
Peter Mortensen,


20
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X

7

Non ho accesso a una macchina Solaris, ma grep "\-X"funziona per me su Linux.


5

Il modo corretto sarebbe usare "-" per interrompere l'elaborazione degli argomenti, come già accennato. Ciò è dovuto all'utilizzo di getopt_long (funzione C GNU da getopt.h) nella sorgente dello strumento.

Questo è il motivo per cui noti gli stessi fenomeni su altri strumenti da riga di comando; poiché la maggior parte di essi sono strumenti GNU e utilizzano questa chiamata, presentano lo stesso comportamento.

Come nota a margine: getopt_long è ciò che ci dà la scelta interessante tra -rlo e --really_long_option e la combinazione di argomenti nell'interprete.


3

Se stai usando un'altra utility che passa un singolo argomento a grep, puoi usare:

'[-]X'


-1
ls -l | grep "^-"

Spero che questo possa servire al tuo scopo.


2
Questa espressione cattura solo le linee che iniziano con un trattino. Non è conforme alla domanda iniziale. Vuole cercare una stringa che inizia con un trattino, ma le righe che contengono questa stringa non sono necessarie per iniziare con un trattino. Nella domanda iniziale, la stringa che inizia con un trattino può essere in qualsiasi punto della riga.
Laurent Simon,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.