2013-08-12 13 views
6

Angenommen, ich eine Datei abc.txt haben die ab*cd Zeile enthält. Als ich dieses Muster ab*cd mit Zitaten grep aber ohne den Stern zu entkommen funktioniert es nicht:Wie grep asterisk ohne zu entkommen?

 
> grep ab*c abc.txt 
> grep "ab*c" abc.txt 
> grep 'ab*c' abc.txt 

Als ich beide Anführungszeichen und Entkommen tut Arbeit

 
> grep "ab\*c" abc.txt 
ab*cd 
> grep 'ab\*c' abc.txt 
ab*cd 

Jetzt frage ich mich, warum die Anführungszeichen funktionieren nicht und wenn ich nur Anführungszeichen verwenden kann, ohne das Sternchen zu entkommen.

+2

Sie können auch eine Zeichenklasse verwenden, um ein wörtliches Sternchen übereinstimmen. Da eckige Klammern auch in der Shell eine Bedeutung haben, müssen Sie den Ausdruck noch zitieren; 'grep 'ab [*] c' abc.txt' – tripleee

+1

Was ist das Problem, das du lösen willst? Wenn Sie beabsichtigen, die Shell zu verwenden, müssen Sie Metazeichen und Zitate verstehen und nicht vermeiden. – tripleee

Antwort

12

Verwenden Sie die Flagge -F für feste Zeichenketten zu suchen - anstelle von regulären Ausdrücken. Von man grep:

-F, --fixed-strings 
      Interpret PATTERN as a list of fixed strings, separated by 
      newlines, any of which is to be matched. (-F is specified by 
      POSIX.) 

Zum Beispiel:

$ grep -F "ab*c" <<< "ab*c" 
ab*c 
6

zunächst einmal sollten Sie im Auge behalten: regex =/= glob

* hat eine besondere Bedeutung in regex. Du musst ihm entkommen, um es wörtlich zu treffen. ohne die * zu entkommen, versucht grep ab+(any number of b)+c

zum Beispiel zum Spiel:

abbbbbbbbbbbbc