Cross Distribution sichere Antwort (einschließlich Windows minGW?)
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
Wenn Sie ältere Versionen von grep (wie 2.4.2) verwenden, die die Option -o nicht enthalten. Verwenden Sie die oben genannten. Andernfalls verwenden Sie die einfachere, um die unten stehende Version zu pflegen.
Linux Cross Distribution sichere Antwort
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
Um Zusammenfassungen -oh
auszugeben, stimmt der reguläre Ausdruck mit dem Dateiinhalt (und nicht mit dem Dateinamen) überein, genau wie Sie erwarten würden, dass regulärer Ausdruck in vim / etc funktioniert ... Welches Wort oder welcher reguläre Ausdruck Sie dann suchen würden, hängt davon ab Du! Solange Sie bei POSIX und nicht bei der Perl-Syntax bleiben (siehe unten)
Mehr aus dem Handbuch für grep
-o Print each match, but only the match, not the entire line.
-h Never print filename headers (i.e. filenames) with output lines.
-w The expression is searched for as a word (as if surrounded by
`[[:<:]]' and `[[:>:]]';
Der Grund, warum die ursprüngliche Antwort nicht für alle funktioniert
Die Verwendung von \w
variiert von Plattform zu Plattform, da es sich um eine erweiterte "Perl" -Syntax handelt. Daher verwendet die Grep-Installation, die auf die Arbeit mit POSIX-Zeichenklassen beschränkt ist, [[:alpha:]]
nicht das Perl-Äquivalent von \w
. Weitere Informationen finden Sie auf der Wikipedia-Seite zum regulären Ausdruck
Letztendlich wird die obige POSIX-Antwort unabhängig von der Plattform (die das Original ist) für grep viel zuverlässiger sein
Für die Unterstützung von grep ohne die Option -o gibt der erste grep die relevanten Zeilen aus, der tr teilt die Leerzeichen in neue Zeilen auf, der letzte grep filtert nur für die jeweiligen Zeilen.
(PS: Ich weiß, dass die meisten Plattformen inzwischen für \ w gepatcht worden wären ... aber es gibt immer solche, die zurückbleiben)
Gutschrift für die "-o" -Umgehung aus der Antwort von @AdamRosenfield