Wie kann ich nach einer Zeichenfolge suchen, die mit einem Bindestrich / Bindestrich beginnt?


347

Ich möchte nach der Zeichenfolge suchen, die wie -Xin einer Datei mit einem Bindestrich / Bindestrich beginnt , aber dies ist als Befehlszeilenargument verwirrend.

Ich habe es versucht:

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

Antworten:


465

Verwenden:

grep -- -X

Verwandte: Was bedeutet ein bloßer Doppelstrich? (dank nussig über natty ).


57
für diejenigen von uns, die sich zu diesem Zeitpunkt fragen, was --bedeutet oder tut: unix.stackexchange.com/questions/11376/…
verrückt nach natty

2
Funktioniert auch mit The Silver Searcher (ag).
Zev Eisenberg

Wenn Sie mit Variablen mit Leerzeichen verwenden möchten, sollten Sie ARGS="-a -b -c" grep -- "$ARGS"
Folgendes verwenden

2
@ zapstar Oder einfach , grep -- "--name awesome".
Brett Widmeier

@BrettWidmeier, ja, ich hätte die Variable nicht verwenden sollen, sie verwirrt die Leute.
Zapstar

57

Der Bindestrich ist ein Sonderzeichen in Bash, wie unter http://tldp.org/LDP/abs/html/special-chars.html#DASHREF angegeben . Wenn Sie dies einmal entkommen, kommen Sie nur an Bash vorbei, aber Grep hat immer noch seine eigene Bedeutung für Bindestriche (indem Sie Optionen bereitstellen).

Sie müssen also wirklich zweimal entkommen (wenn Sie die anderen genannten Antworten nicht verwenden möchten). Folgendes wird / sollte funktionieren

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

Eine Möglichkeit, herauszufinden, wie Bash Argumente an ein Skript / Programm übergibt, besteht darin, ein .sh-Skript zu erstellen, das nur alle Argumente wiedergibt. Ich benutze ein Skript namens echo-args.sh, um von Zeit zu Zeit damit zu spielen. Alles, was es enthält, ist:

echo $*

Ich rufe es auf als:

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

Du hast die Idee.


1
Ich glaube nicht - ist eine Besonderheit in Bash, trotz der Aussagen des ABS-Leitfadens. Bash verarbeitet keine Argumente, die mit beginnen - anders als andere. Der Befehl oder die integrierte Funktion, die Bash anschließend aufruft, verarbeitet Argumente, die mit einem Bindestrich beginnen, wie es ihm passt. Die meisten integrierten Bash-Befehle sowie Linux- und GNU-Befehle werden als Optionsabschluss behandelt. Verwenden Sie 'set -x', um die Befehle und Argumente anzuzeigen, die Bash verwendet, bevor sie ausgeführt werden, aber nachdem Bash Escape-, Globs- und Klammern erweitert hat. Grep ist ein verwirrendes Beispiel, da es seine eigene Behandlung von Backslash-Escape-Vorgängen ausführt.
Noah Spurrier

25

grep -e -X wird den Trick machen.


1
Mein Grep hat nicht -e, sehr komisch
Mike

14
Solaris für die Niederlage
Mike

2
Verfügbar auf Solaris von / usr / xpg4 / bin / grep, übrigens. Viele vollständigere Dienstprogramme in diesem Verzeichnis.
Pra

Es hat unter MinGW funktioniert ( MinGW unterstützt nicht -P(aber das ist eine andere Geschichte und gilt hier nicht)).
Peter Mortensen


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

7

Ich habe keinen Zugriff auf eine Solaris-Maschine, grep "\-X"arbeite aber für mich unter Linux.


5

Der richtige Weg wäre, "-" zu verwenden, um die Verarbeitung von Argumenten zu stoppen, wie bereits erwähnt. Dies liegt an der Verwendung von getopt_long (GNU C-Funktion von getopt.h) in der Quelle des Tools.

Aus diesem Grund stellen Sie bei anderen Befehlszeilentools dieselben Phänomene fest. Da die meisten von ihnen GNU-Tools sind und diesen Aufruf verwenden, weisen sie dasselbe Verhalten auf.

Als Randnotiz - getopt_long gibt uns die coole Wahl zwischen -rlo und --really_long_option und der Kombination von Argumenten im Interpreter.


3

Wenn Sie ein anderes Dienstprogramm verwenden, das grep ein einzelnes Argument übergibt, können Sie Folgendes verwenden:

'[-]X'


-1
ls -l | grep "^-"

Hoffe, dieser würde Ihren Zweck erfüllen.


2
Dieser Ausdruck fängt nur Zeilen ab, die mit einem Bindestrich beginnen. Es entspricht nicht der ursprünglichen Frage. Er möchte nach einer Zeichenfolge suchen, die mit einem Bindestrich beginnt, aber die Zeilen, die diese Zeichenfolge enthalten, müssen nicht mit einem Bindestrich beginnen. In der ersten Frage kann sich die mit einem Bindestrich beginnende Zeichenfolge an einer beliebigen Stelle in der Zeile befinden.
Laurent Simon

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.