Je recherche des fichiers en fonction d'une expression régulière, puis j'essaie de rechercher du contenu dans ces fichiers. Ainsi, par exemple, j'ai quelque chose comme
#Find all C++ files that match a certain pattern and then search them
find . -name "*.cpp" | grep "<name regex>" | xargs grep "<content regex>"
Le problème que je rencontre est que certains des chemins contiennent des espaces, ce qui est déroutant xargs
. Je sais que si j'utilisais simplement find
, je pourrais utiliser l' -print0
argument (avec l' -0
argument xargs
activé) pour empêcher les xargs de traiter les espaces comme des délimiteurs. Y a-t-il quelque chose de similaire avec grep
?
Ou est-ce que j'aborde complètement ce problème de la mauvaise façon? Naïvement, find
to a grep
du xargs grep
sens pour moi, mais je suis ouvert à d'autres approches qui donnent les mêmes résultats.
xargs
en utilisant le-i
paramètre, a lacat sample.txt | grep "pat t ern" | xargs -i grep "{}"
- les accolades indiquent où positionner l'argument. Le manuel me dit que-i
c'est déconseillé en faveur de-I
donc peut-être la peine d'y jeter un œil.Réponses:
Utilisez peut-être quelque chose comme ça (si gnu grep).
homme grep
Voir également les options pour les délimiteurs nuls.
la source
grep -r include='*.cpp'
s'agit d'un glob de coquille - et il en est de même des fonctionnalités alignées w /find . -name '*.cpp' -exec grep -e 'content_pattern' -- {} \;
not w /find . -name '*.cpp' | grep 'name_pattern' | xargs grep 'content_pattern'
Si vous devez sauter à travers de nombreux cerceaux, alors l'efficacité des xargs est de toute façon perdue. Voici un travail grossier:
Chaque fois que je rencontre des problèmes avec des espaces dans les noms de fichiers, la réponse est des guillemets doubles sur une variable.
la source
Utilisez
find
pour effectuer tout le filtrage des noms de fichiers. Plutôt quefaire
Si vous voulez faire quelque chose de légèrement plus compliqué, comme
tu peux faire
Notez que ceux-ci devraient fonctionner même pour les fichiers avec des retours à la ligne dans leurs noms.
Et, si vous avez besoin de la puissance d'expressions régulières à part entière, vous pouvez utiliser
-regex
.la source
Cela devrait fonctionner même sans outils GNU:
L'
perl
appel remplace les sauts de ligne par des caractères nuls, ce qui permettraxargs -0
d'interpréter les entrées ligne par ligne plutôt que par espace blanc.En utilisant GNU, vous pouvez supprimer l'
perl
appel et passerxargs -0 …
àxargs -d "\n" …
Vous n'avez pas
perl
ou GNU? Essayezawk '{printf "%s%c", $0, 0}'
plutôt.la source
xargs -d "\n"
. C'est un événement très inhabituel, mais si vous n'avez pas le contrôle des données et que vous craignez que ce soit un risque pour la sécurité, faites attention aux attentes de sortie.