2016-06-30 9 views
-1

Ich versuche, etwas in einer Datei mit einem Muster mit dem '*' zu finden, aber funktioniert nicht, irgendeine Idee, wie man das macht?Wie grep '*' in Unix Korn Shell

das ist, was ich versuche zu tun: alle

grep "files*.txt" $myTestFile 

nichts zurückkehrt, die es annimmt, dass „*“ sein sollte.

+0

ja, arbeite als grep 'files *' $ myTestFile, aber nicht mit .txt am ende –

+1

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 "? –

+1

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. –

Antwort

1

standardmäßig grep nicht erweitern regulären Express nicht unterstützt, aber grep -E oder egrep tun.

egrep "-Dateien. * \. Txt" $ myTestFile

oder

grep -E "-Dateien. * \. Txt" $ myTestFile

In Zusätzlich stehen drei Variantenprogramme egrep, fgrep und rgrep zur Verfügung. egrep ist das gleiche wie grep -E. fgrep ist das gleiche wie grep -F. rgrep ist das gleiche wie grep -r. Direkter Aufruf als entweder egrep oder fgrep ist veraltet, wird aber bereitgestellt, um es historischen Anwendungen zu erlauben, die davon abhängen, dass sie unverändert ausgeführt werden.

Matcher Selection 
     -E, --extended-regexp 
       Interpret PATTERN as an extended regular expression (ERE, see below). (-E is specified by POSIX.) 

     -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.) 

     -G, --basic-regexp 
       Interpret PATTERN as a basic regular expression (BRE, see below). This is the default. 

     -P, --perl-regexp 
       Interpret PATTERN as a Perl regular expression (PCRE, see below). This is highly experimental and `grep -P` may warn of unimplemented features. 
+0

Lösung von Jonathan und Jiangty funktioniert für mich! Vielen Dank! –

1

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.