Ich fand echo file|grep fil*
fehlgeschlagen, aber echo abcd|grep abc*
erfolgreich.
Ich verstehe es nicht, kann jemand erklären?
Ich fand echo file|grep fil*
fehlgeschlagen, aber echo abcd|grep abc*
erfolgreich.
Ich verstehe es nicht, kann jemand erklären?
Antworten:
Es gibt zwei Probleme mit Ihrem Beispiel.
Das wichtigste ist, dass Sie davon ausgehen, dass reguläre Ausdrücke genauso funktionieren wie Glob-Muster , da *
es sich um einen Platzhalter handelt, der "eine beliebige Folge von Zeichen" bedeutet. In regulären Ausdrücken, *
bedeutet „ eine beliebige Anzahl des vorherigen Atom“ statt, so fil*
Mittel , f
gefolgt von i
null oder mehr gefolgt l
Zeichen. Sie müssen sagen grep fil.*
, um die beabsichtigte Bedeutung zu erhalten: .
bedeutet "jedes einzelne Zeichen, das .*
heißt" jede Folge von Zeichen ".
Das kleinere Problem ist, dass Sie nicht zitierte Sonderzeichen verwenden, die unter Glob-Regeln etwas bedeuten, was bedeutet, dass die Shell sie interpretieren kann. Wenn Sie Dateien im lokalen Verzeichnis haben die glob - Muster passende fil*
oder abc*
, würde die Schale sie erweitert , so grep
würde die erweiterten Dateinamen als Muster erhält, nicht die beabsichtigten RE. Wenn Sie solche Zeichen in der Befehlszeile verwenden, sollten Sie sie in Anführungszeichen setzen : echo file | grep 'fil.*'
.
echo file|grep fil*
Antworten mitfil
e.