Réponse sécurisée à 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. Utilisez ce qui précède. Sinon, utilisez le plus simple pour maintenir la version ci-dessous.
Réponse sécurisée à la distribution croisée Linux
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
Pour résumer les -oh
sorties, l'expression régulière correspond au contenu du fichier (et non à son nom de fichier), tout comme la façon dont vous vous attendriez à ce que l'expression régulière fonctionne dans vim / etc ... Le mot ou l'expression régulière que vous recherchez alors dépend vous! Tant que vous restez sur POSIX et non sur la syntaxe Perl (voir ci-dessous)
Plus dans le manuel de 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 plateforme à l'autre, car c'est une syntaxe "perl" étendue. En tant que telle, cette installation grep qui est limitée au travail avec les classes de caractères POSIX utilise [[:alpha:]]
et non son équivalent perl \w
. Voir la page Wikipedia sur l'expression régulière pour en savoir plus
En fin de compte, la réponse POSIX ci-dessus sera beaucoup plus fiable quelle que soit la plate-forme (étant l'original) pour grep
Quant à la prise en charge de grep sans l'option -o, le premier grep sort les lignes pertinentes, le tr divise les espaces en nouvelles lignes, le grep final filtre uniquement pour les lignes respectives.
(PS: je sais que la plupart des plates-formes auraient été corrigées pour \ w .... mais il y a toujours celles qui sont en retard)
Crédit pour la solution de contournement «-o» de @AdamRosenfield réponse