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.
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:
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.
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.
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
--
bedeutet oder tut: unix.stackexchange.com/questions/11376/…ARGS="-a -b -c"
grep -- "$ARGS"
grep -- "--name awesome"
.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
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:
Ich rufe es auf als:
Du hast die Idee.
quelle
grep -e -X
wird den Trick machen.quelle
-P
(aber das ist eine andere Geschichte und gilt hier nicht)).grep -e '--cut here--' *
sucht nach allen übereinstimmenden Zeilen‘--cut here--’
. Ohne -e würde grep versuchen,‘--cut here--’
als Liste von Optionen zu analysieren .quelle
Ich habe keinen Zugriff auf eine Solaris-Maschine,
grep "\-X"
arbeite aber für mich unter Linux.quelle
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.
quelle
Wenn Sie ein anderes Dienstprogramm verwenden, das grep ein einzelnes Argument übergibt, können Sie Folgendes verwenden:
quelle
Sie können Nawk verwenden
quelle
Hoffe, dieser würde Ihren Zweck erfüllen.
quelle
grep "^ -X" Datei
Es werden alle Zeilen aus der Datei erfasst und ausgewählt. ^ im grep "^" gibt eine Zeile an, die mit beginnt
quelle
-
, nicht nach Zeilen.