Existe-t-il un moyen de créer des "mots" de sortie grep à partir de fichiers correspondant à l'expression de recherche?
Si je veux trouver toutes les instances de, disons, "th" dans un certain nombre de fichiers, je peux faire:
grep "th" *
mais la sortie sera quelque chose comme (gras est par moi);
fichier-texte: le chat était assis sur le tapis autre-fichier-texte: le renard brun rapide encore un autre fichier texte: j'espère que cela l' explique à fond
Ce que je veux qu'il génère, en utilisant la même recherche, c'est:
the
the
the
this
thoroughly
Est-ce possible en utilisant grep? Ou en utilisant une autre combinaison d'outils?
Réponses:
Essayez grep -o
Edit: correspondance du commentaire de Phil
De la documentation :
la source
"\w*th\w*" *
signifie, alors j'ai pensé que je posterais.\w
est [_ [: alnum:]], donc cela correspond essentiellement à tout "mot" qui contient "th" (car il\w
n'inclut pas d'espace). Le * après la section citée est un glob pour lequel les fichiers (ie, correspondant à tous les fichiers de ce répertoire)\w
n'est généralement pas portable pourgrep -E
; pour une portabilité correcte, utilisez[[:alnum:]]
plutôt le nom de la classe de caractères POSIX (ou[_[:alnum:]]
si vous voulez vraiment le soulignement aussi; ou essayezgrep -P
si votre plate-forme en dispose).-h
c'est tout à fait nécessaire, je dirais ..?Réponse sécurisée à la distribution croisée (y compris Windows MinGW?)
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
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
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 plusEn 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
la source
-o
option n'est pas présente dans le grep windows qui s'installe avec le paquet git (minGW?):"c:\Program Files (x86)\Git\bin\grep" --version grep (GNU grep) 2.4.2
C'est plus simple que vous ne le pensez. Essaye ça:
Où,
la source
Vous pouvez traduire des espaces en sauts de ligne, puis grep, par exemple:
la source
tr
, il pourrait le faire engrep
premier, donctr
ne serait appliqué qu'aux lignes correspondantes:grep th filename | tr ' ' '\n' | grep th
Juste
awk
, pas besoin d'une combinaison d'outils.la source
commande grep pour la correspondance et perl uniquement
la source
th
parce que vous avez demandé la répétition la plus courte possible du caractère générique.Je n'étais pas satisfait de la syntaxe difficile à retenir d'awk mais j'ai aimé l'idée d'utiliser un utilitaire pour le faire.
Il semble que ack (ou ack-grep si vous utilisez Ubuntu) peut le faire facilement:
Si vous omettez l'indicateur -h, vous obtenez:
En bonus, vous pouvez utiliser l'
--output
indicateur pour le faire pour des recherches plus complexes avec à peu près la syntaxe la plus simple que j'ai trouvée:la source
la source
cat
?Pour rechercher tous les mots commençant par "icon-", la commande suivante fonctionne parfaitement. J'utilise ici Ack qui est similaire à grep mais avec de meilleures options et un formatage agréable.
la source
Vous pouvez également essayer pcregrep . Il y a aussi une
-w
option dans grep , mais dans certains cas, cela ne fonctionne pas comme prévu.De Wikipédia :
la source
J'ai eu un problème similaire, à la recherche de grep / motif regex et du "motif correspondant trouvé" en sortie.
À la fin, j'ai utilisé egrep (même expression régulière sur grep -e ou -G ne m'a pas donné le même résultat d'egrep) avec l'option -o
donc, je pense que cela pourrait être quelque chose de similaire à (je ne suis pas un maître regex):
la source
{1}
quantificateurs inutiles doivent être supprimés. Ou si vous voulez être cohérent,t{1}h{1}e{1}
etc.Vous pouvez diriger votre sortie grep vers Perl comme ceci:
la source
Extrait de la page de manuel grep:
-w: sélectionnez uniquement les lignes contenant des correspondances qui forment des mots entiers. Le test est que la sous-chaîne correspondante doit être soit au début de la ligne, soit précédée d'un caractère constituant autre qu'un mot.
la source
the
ne corresponde plus, par exemple "ces" ou "baignade".ripgrep
Voici l'exemple utilisant
ripgrep
:Il correspondra à tous les mots correspondants
th
.la source