Réponse sûre à la distribution croisée (y compris Windows minGW ?)
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
Si vous utilisez des versions plus anciennes de grep (comme 2.4.2) qui n'incluent pas l'option -o, alors utilisez la méthode ci-dessus. Sinon, utilisez la version plus simple à maintenir ci-dessous.
Réponse sûre à la distribution croisée de Linux
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
Pour résumer : -oh
produit l'expression régulière correspondant au contenu du fichier (et non à son nom de fichier), tout comme on pourrait s'attendre à ce qu'une expression régulière fonctionne dans vim/etc.... Le mot ou l'expression régulière que vous recherchez alors, c'est vous qui décidez ! Tant que vous restez dans le cadre de POSIX et non de la syntaxe perl (voir ci-dessous).
Plus du manuel pour 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 raison pour laquelle la réponse originale ne fonctionne pas pour tout le monde
L'utilisation de \w
varie d'une plate-forme à l'autre, car il s'agit d'une syntaxe "perl" étendue. En tant que telles, les installations grep qui sont limitées au travail avec les classes de caractères POSIX utilisent [[:alpha:]]
et non son équivalent perl de \w
. Voir la page Wikipedia sur les expressions régulières pour plus d'informations
Au final, la réponse POSIX ci-dessus sera beaucoup plus fiable quelle que soit la plateforme (étant l'original) pour grep
En ce qui concerne le support de grep sans l'option -o, le premier grep sort les lignes pertinentes, le tr divise les espaces en nouvelles lignes, le dernier grep ne filtre que les lignes respectives.
(PS : je sais que la plupart des plates-formes auraient déjà été corrigées pour le \w.... mais il y a toujours ceux qui sont à la traîne)
La solution de contournement "-o" est due à la réponse de @AdamRosenfield.
7 votes
La solution de Dan Midwood fonctionne parfaitement et mérite le crédit.
0 votes
Existe-t-il un moyen d'imprimer ces mots appariés sans modifier les lignes ? La chaîne de caractères correspondante devrait plutôt rester sur la même ligne ?