Dupliquer possible:
rechercher un modèle de texte sous linux
Sous Bash, je me demandais s’il existait des commandes permettant de savoir si une chaîne particulière que vous recherchez existe dans les fichiers situés dans le répertoire actuel dans lequel vous vous trouvez.
Supposons que vous cherchiez la fonction 'toUpperCase ()' dans un ensemble de fichiers C de votre répertoire actuel. Il y a beaucoup de fichiers, vous ne voudriez donc pas les ouvrir manuellement à l'aide de vim et vérifier la chaîne 'toUpperCase' car cela prendrait beaucoup de temps. Si ce n'est pas une ligne de commande bash, existe-t-il une autre méthode pour le faire efficacement?
L'outil de recherche de texte standard est grep .
Pour rechercher la chaîne
toUpperCase(
dans tous les.c
fichiers du répertoire actuel:Si vous souhaitez également consulter les sous-répertoires:
Si vous recherchez des appels de fonction C, les balises ctags peuvent constituer un meilleur ajustement. Vous l'exécutez une fois sur tous vos fichiers source pour créer un index d'identifiants, puis utilisez votre éditeur pour naviguer entre les appels. Tous les éditeurs de type vi peuvent utiliser le
TAGS
fichier ctags . Si vous utilisez Emacs, exécutez le programme similaireetags
.la source
ctags
est utile pour trouver des définitions de fonction , pas des appels de fonction .Vous utilisez vim. Vous avez un outil pour faire cela intégré.
Comme on pouvait s'y attendre, il y a déjà sept réponses à utiliser
grep
. Mais il semble que je sois la seule personne à ce jour à avoir remarqué dans votre question que vous utilisezvim
. En tant que tel, bien que vous puissiez utilisergrep
de l'intérieurvim
, vous pouvez également utiliservim
l'outil intégré. Ceci est appelé via la:vimgrep
commande.Pour rechercher "tous les fichiers source C dans le répertoire en cours pour les appels à la fonction
toUpperCase()
",vim
tapez la commandeLa liste de correspondances résultante est automatiquement chargée dans la liste des correctifs rapides, accessible avec l’un des deux (voir l’aide en ligne pour connaître la différence subtile).
Pour trouver la définition de la fonction , plutôt que de l'appeler,
ctags
utilisez l'outil, comme indiqué dansGilles
la réponse de , en conjonction avec les commandes:tjump
ou:tselect
.Pourquoi utiliser
:vimgrep
?La fonction help (
:help grep
) en ligne énumère plusieurs des raisons que je ne vais pas mentionner ici. En plus de celles-ci, comparez l’action de:vimgrep
avec celle dedietbuddha
' .dietbuddha
La ligne de commande de sks lance ungrep
processus individuel pour chaque fichier source C individuel. Il n'emploie même pasxargs
pour réduire ces frais généraux. Et il vous reste à analyser la sortie pour appeler votre éditeur de texte sur les fichiers sources pertinents une fois que celui-ci est terminé.:vimgrep
ne déclenche pas du tout plusieurs processus supplémentaires, et utiliser le résultat est la simplicité même. Le simple fait de sélectionner l'une des entrées de la liste de correctifs rapides résultante positionne automatiquement le curseur sur la ligne appropriée du fichier source correspondant.En fait, il fait exactement ce que vous avez écrit à la main, sauf automatiquement. C'est la manière automatisée de faire ces actions d'éditeur de texte. Il charge le fichier comme s'il était chargé à la main, recherche une expression régulière (en utilisant la même syntaxe d'expression régulière que celle que vous utilisez déjà ailleurs
vim
), enregistre les emplacements où les correspondances se produisent, puis décharge le fichier.la source
Oui, l'outil s'appelle
grep
.L'utilisation de base est:
Ou plus spécifiquement:
Dans un cas très simple, vous souhaitez récursivement rechercher dans tous les fichiers, vous indiquez donc l'
-r
option. Si vous ne vous souciez pas des majuscules ou des minuscules, faites en sorte que l'-i
option soit insensible à la casse .Si vous ne voulez que les pièces correspondantes, utilisez l'
-o
option.Grep peut utiliser des expressions régulières et dispose d’un manuel énorme .
la source
grep
est la réponse standard - en utilisant l’indicateur -r pour effectuer une recherche récursive ou en conjonction avecfind
(discussion et exemples dans d’autres questions de ce site, comme celle-ci )Mon choix préféré est dernièrement
ack
. Il n'est probablement pas installé sur votre ordinateur, mais vous pouvez l'installer à l'aide d'apt-get sur Ubuntu ou simplement le télécharger. Les liens, les instructions et les raisons pour lesquelles il vaut mieux que grep sont disponibles à l' adresse http://betterthangrep.com/la source
find
etgrep
find myproject -name '*.c' -exec grep 'toUpperCase(' {} \; -print
pourquoi non seulement
grep
?grep -r string .
recurse dans tous les fichiers du répertoire en cours. Si vous avez des fichiers objet ou d’autres fichiers binaires, vous pouvez obtenir une correspondance avec des résultats binaires. déchet. Si vous avez également des fichiers fifos ou de périphérique dans votre sous-répertoire, vous risquez d’avoir des conséquences inconnues ou inattendues.grep string *.c
recherche uniquement dans les.c
fichiers de répertoires actuels .grep string **/*.c
effectue une recherche dans tous les sous-répertoires. Toutefois, si vous avez un très grand nombre de.c
fichiers, vous courez le risque de dépasser le nombre maximal d’expansions pour le shell global. L’expansion doit également avoir lieu en premier, ce qui signifie une traversée complète de l’arbre avant degrep
commencer.la source
Grep fera l'affaire, mais un peu de script supplémentaire aidera à trouver le nom du fichier et la ligne exacte référencée. Si c'est ce que vous voulez, je trouve que ce qui suit fonctionne bien. Je l'ai enregistré en tant que script shell et transmettez-lui la valeur que je veux comme première option de ligne de commande.
la source
Je trouve intéressant que personne n’ait répondu à votre question précise: "Comment savoir si une chaîne particulière existe dans les fichiers situés dans le répertoire actuel". Autant que je sache, il n'y a pas d'option grep qui indique uniquement si une correspondance a été trouvée dans un groupe de fichiers. L'option la plus proche est -l pour lister le ou les noms de fichiers. La réponse la plus proche parmi ceux-ci est de tim, avec quelques légères modifications:
Vous pouvez rendre ce script shell plus générique en acceptant un second argument pour l'extension de fichier sans trop de difficulté.
doug
la source