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'
Mike
quelle

Antworten:

465

Verwenden:

grep -- -X

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

newacct
quelle
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.

Chad Gorshing
quelle
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.

Thomas
quelle
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
John Henry
quelle
7

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

ezpz
quelle
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.

fmmarques
quelle
3

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

'[-]X'
Colin vH
quelle
2

Sie können Nawk verwenden

$ nawk '/-X/{print}' file
Ghostdog74
quelle
-1
ls -l | grep "^-"

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

XINU
quelle
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
-1

grep "^ -X" Datei

Es werden alle Zeilen aus der Datei erfasst und ausgewählt. ^ im grep "^" gibt eine Zeile an, die mit beginnt

sasank
quelle
1
Es gibt bereits eine Antwort , die den vorgeschlagen stackoverflow.com/a/27440348/441757 (veröffentlicht mehr als vor einem Jahr)
sideshowbarker
Das OP sucht nach Zeichenfolgen , die mit beginnen -, nicht nach Zeilen.
Codeforester