Resposta segura de distribuição cruzada (incluindo windows minGW?)
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
Se você estiver usando versões mais antigas do grep (como 2.4.2), que não inclui a opção -o. Use o acima. Caso contrário, use o mais simples para manter a versão abaixo.
Resposta segura para distribuição cruzada do Linux
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
Para resumos, -oh
a expressão regular corresponde ao conteúdo do arquivo (e não ao nome do arquivo), exatamente como você esperaria que a expressão regular funcionasse no vim / etc ... Qual palavra ou expressão regular você procuraria então, depende de você! Enquanto você permanecer no POSIX e não na sintaxe perl (consulte abaixo)
Mais do manual para 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 `[[:>:]]';
A razão pela qual a resposta original não funciona para todos
O uso de \w
varia de plataforma para plataforma, pois é uma sintaxe "perl" estendida. Como tal, a instalação grep limitada a trabalhar com classes de caracteres POSIX usa [[:alpha:]]
e não seu equivalente em perl \w
. Veja a página da Wikipedia sobre expressões regulares para mais
Por fim, a resposta POSIX acima será muito mais confiável, independentemente da plataforma (sendo a original) para grep
Quanto ao suporte à opção grep sem -o, o primeiro grep gera as linhas relevantes, o tr divide os espaços em novas linhas, o grep final filtra apenas as respectivas linhas.
(PS: Eu sei que a maioria das plataformas até agora teria sido corrigida por \ w .... mas sempre há aquelas que ficam para trás)
Crédito pela solução alternativa "-o" da resposta @AdamRosenfield