Shell UNIX : grep-wild card
Ich kann nicht herausfinden, warum der wild-Zeichen * wird unterschiedlich interpretiert, in der folgenden Beispiele mit grep :
find . -type f -name \*
Ergebnisse :
./tgt/etc/test_file.c
./tgt/etc/speleo/test_file.c
./tgt/etc/other_file.c
./src/file.c
Möchte ich zu dem zurückkehren von diesem Befehl die Dateien, die einem Muster entsprechen, mit evtl. ein wildcard -*. Aber :
find . -type f -name \* | grep "tgt/etc/*" # this one works
find . -type f -name \* | grep tgt/etc/* # not this one
find . -type f -name \* | grep tgt/et*/s* # this one works
find . -type f -name \* | grep "tgt/et*/s*" # not this one
Ich würde gerne eine Umsetzung, die funktioniert für beide Fälle. Was sollte ich verwenden ?
- Sie verstehen, dass
*
funktioniert anders in regulären Ausdrücken als in dem Dateinamen Platzhalter, richtig? - Blick auf die Frage, ich vermute, er nicht 🙂
- Ich kann etwas fehlt, aber nicht sehen, wie, dass hat nichts mit der Frage zu tun. Das problem ist, wie grep Prozess Argumente, Bedeutung
grep file1 file2
, übereinstimmen, werden nicht beidefile1
undfile2
. - Ja, ich erkannte, diese Frage war komplizierter, nachdem ich diesen Kommentar geschrieben; siehe meine Antwort.
- Das ist das Problem mit seiner nicht börsennotierten greps, mein Kommentar ist mehr relevant für seine zitiert greps, weil Sie nicht verwenden
*
richtig. - Du hast Recht, habe ich falsch verstanden, die unterschiedliche Nutzungen * zwischen shell als Platzhalter und regexp als Quantifizierer. Oder zumindest habe ich nicht einmal darüber nachdenken. Ihre Antworten erlauben Sie mir, mein problem zu lösen mit einem vollständigen regulären Ausdruck : grep "/tgt et.*/s.*" zum Beispiel. Danke Jungs.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das erste argument
grep
ist nicht eine wildcard, es ist ein regulärer Ausdruck. In einem regulären Ausdruck,*
bedeutet, für eine beliebige Anzahl von Zeichen oder Ausdruck, dass es vorangeht. SoMittel zum match
tgt/etc
gefolgt von null oder mehr/
Zeichen. In einem Platzhalter*
bedeutet, für eine beliebige Anzahl von beliebigen Zeichen, die äquivalente reguläre Ausdruck ist.*
. Für Ihre Zwecke, die Befehle, die Sie wollen, sind:Auch, wenn Sie nicht zitieren, das argument, und es enthält alle
*
Zeichen, die von der shell erweitern Sie das argument als Dateinamen Platzhalter, bevor Sie als Argumente fürgrep
. Also, wenn Sie schreiben:die shell erweitern um
Diese behandeln die
tgt/etc/file1
als regulären Ausdruck zu suchen, und suchen es in der verbleibenden Dateien-es wird nicht Prozess, der die Eingabe aus der pipeline, weil es wurde gegeben mit dem Namen Argumenten.Den nicht börsennotierten Beispiele (ohne die
"
) erweitert werden, von der shell, bevorgrep
je sieht. Das ist nur die Art, wie Unix-shells arbeiten.Für den angebotenen diejenigen, beachten Sie, dass
*
in einem grep Muster bedeutet etwas anderes aus, was es bedeutet, die shell und zufind
: Es bedeutet "wiederholen Sie das vorhergehende Zeichen beliebig oft (einschließlich der null)."weil
grep
nutzt regexps und keine wildcards.also im Grunde, was Sie tun, ist:
tgt/etc/*
Prüfung null oder sereval/
tgt/et*/s*
überprüfung der null oder mehreret
und null oder mehreres
aber die Sache ist, dass, wenn Sie nicht, setzen Sie Anführungszeichen um die regexp, die shell erweitert den
*
als Platzhalter, die vermasselt die grep regexp sieht.