Respuesta segura de distribución cruzada (incluyendo windows minGW?)
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
Si está utilizando versiones anteriores de grep (como 2.4.2) que no incluye la opción -o. Usa lo anterior. De lo contrario, use la versión más simple para mantener la siguiente.
Respuesta segura de distribución cruzada de Linux
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
A resúmenes -oh
, las expresiones regulares coinciden con el contenido del archivo (y no con su nombre de archivo), tal como se esperaría que funcionara la expresión regular en vim / etc ... Qué palabra o expresión regular estaría buscando entonces, depende de ¡tú! Mientras permanezca en POSIX y no en la sintaxis de Perl (consulte a continuación)
Más del 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 `[[:>:]]';
La razón por la cual la respuesta original no funciona para todos
El uso de \w
varía de una plataforma a otra, ya que es una sintaxis "perl" extendida. Como tal, la instalación grep que se limita al trabajo con clases de caracteres POSIX usa [[:alpha:]]
y no su equivalente perl \w
. Vea la página de Wikipedia sobre expresiones regulares para más
En última instancia, la respuesta POSIX anterior será mucho más confiable independientemente de la plataforma (que es la original) para grep
En cuanto al soporte de grep sin la opción -o, el primer grep genera las líneas relevantes, el tr divide los espacios en nuevas líneas, los filtros grep finales solo para las líneas respectivas.
(PD: Sé que la mayoría de las plataformas por ahora, habrían sido parcheadas para \ w ... pero siempre hay aquellas que se quedan atrás)
Crédito por la solución "-o" de la respuesta de @AdamRosenfield