Wenn Sie nur die exakte Zeichenfolgefiles*.txt
übereinstimmen soll, das wäre:
# match exactly "files*.txt"
grep -e "files[*][.]txt" "$myTestFile"
... oder, einfacher gesagt fgrep
mit nur passen die genaue Zeichenfolge gegeben:
# match exactly "files*.txt"
fgrep -e 'files*.txt' "$myTestFile"
[*]
definiert eine Zeichenklasse mit nur einem einzigen Zeichen - die *
- enthalten und stimmt somit nur mit diesem einen Zeichen überein. Backslash-basiertes Escaping ist ebenfalls möglich, kann jedoch in verschiedenen Kontexten unterschiedliche Bedeutungen haben und ist daher weniger zuverlässig.
Wenn Sie jede Zeile übereinstimmen, die files
enthält, und später .txt
, dann:
# match any line containing "files" and later ".txt"
grep -e "files.*[.]txt" "$myTestFile"
.*
entspricht null-oder-mehr Zeichen und ist somit die Regex entspricht dem glob- Muster *
. Ebenso, während in einem Glob-Muster .
nur sich selbst entspricht, in einem Regex .
kann jedes Zeichen übereinstimmen, so dass die .
in .txt
muss wie in [.]txt
maskiert werden, um zu verhindern, dass es irgendetwas anderes entspricht.
ja, arbeite als grep 'files *' $ myTestFile, aber nicht mit .txt am ende –
Meinst du, es muss buchstäblich passen 'files * .txt', oder könnte es auch sagen,' filesfoo.txt '? Und meinst du '. 'Im Globensinn, wo es nur einem Literal entspricht?', oder im Regex-Sinne, wo es mit einem beliebigen Zeichen übereinstimmt? In diesem Sinne meinst du das '*' im Regex-Sinne, wo es "0-oder-mehr-' s "bedeutet, oder im Muster-Sinne, wo es bedeutet" alles zusammenpassen "? –
Nichts ksh-spezifisch hier, abgesehen davon, dass Sie eine Shell verwenden, die POSIX-Erweiterungsregeln mit '$ myTestFile' ohne umgebende Anführungszeichen folgt, ist fehlerhaft (versuchen Sie, einen Dateinamen mit Leerzeichen auf diese Weise zu übergeben). Das Verhalten von 'grep' wird von Ihrem Betriebssystem definiert, nicht von Ihrer Shell - das sagt uns, welche Shell Sie haben, gibt nicht viele Hinweise darüber, welche 'grep' Sie haben. –