J'avais besoin de trouver tous les fichiers contenant un modèle de chaîne spécifique. La première solution qui vient à l'esprit est d'utiliser find piped avec xargs grep :
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
Mais si j'ai besoin de trouver des modèles qui s'étendent sur plus d'une ligne, je suis bloqué parce que vanilla grep ne peut pas trouver de modèles multilignes.
Réponses:
J'ai donc découvert pcregrep qui signifie GREP d'expressions régulières compatibles Perl .
Par exemple, vous devez trouver des fichiers où la variable ' _name ' est immédiatement suivie de la variable ' _description ':
Conseil: vous devez inclure le caractère de saut de ligne dans votre motif. Selon votre plate-forme, il peut s'agir de '\ n', \ r ',' \ r \ n ', ...
la source
pcregrep
est disponible sur le mac avecbrew install pcre
-H
qui imprime le nom du fichier avant chaque match:pcregrep -HM
.Pourquoi n'allez-vous pas pour awk :
la source
awk
avec la plupart des systèmes * nix.awk '/Start pattern/,/End pattern/ {printf NR " "; print}' filename
. Vous pouvez le faire plus joli en donnant les numéros de ligne d' une largeur fixe:awk '/Start pattern/,/End pattern/ {printf "%-4s ", NR; print}' filename
.Voici l'exemple utilisant GNU
grep
:Voir aussi ici
la source
-z
afin de ne pas diviser la recherche sur une seule ligne et-o
d'imprimer uniquement la partie correspondante.grep -rzl pattern *
, -rzo ne fonctionnait pas)brew reinstall --with-pcre git
grep -P
utilise également libpcre, mais est beaucoup plus largement installé. Pour trouver unetitle
section complète d'un document html, même s'il s'étend sur plusieurs lignes, vous pouvez utiliser ceci:Puisque le projet PCRE est implémenté selon le standard perl, utilisez la documentation de perl pour référence:
la source
Voici un exemple plus utile:
Il recherche la balise de titre dans un fichier html même si elle s'étend sur 5 lignes.
Voici un exemple de lignes illimitées:
la source
(?s)
à votre expression régulière, comme ceci:"(?s)<html>.*</html>"
$
(à la fin d'un motif) pour signifier que c'est la fin de la ligne - bien que ce ne soit pas la même chose que de vous aider à trouver plusieurs motifs de ligne. Voir aussiglob(7)
. Vous pourriez également trouver ce site Web intéressant: regular-expressions.infoAvec le chercheur d'argent :
Les optimisations de vitesse du chercheur d'argent pourraient éventuellement briller ici.
la source
Vous pouvez utiliser l'alternative grep EIPD ici (disclaimer: je suis l'auteur).
Il prend en charge la correspondance multiligne et limite la recherche à des types de fichiers spécifiques prêts à l'emploi:
(recherchez tous les fichiers * .py pour le modèle d'expression régulière multiligne spécifié)
Il est disponible pour tous les principaux systèmes d'exploitation. Jetez un œil à la page d'exemples pour voir comment elle peut être utilisée pour extraire des valeurs multilignes d'un fichier XML.
la source
Cette réponse pourrait être utile:
Regex (grep) pour la recherche multiligne nécessaire
Pour rechercher récursivement, vous pouvez utiliser les indicateurs -R (récursif) et --include (modèle GLOB). Voir:
Utilisez la syntaxe grep --exclude / - include pour ne pas greper certains fichiers
la source
@Marcin: exemple awk non gourmand:
la source
la source
Utilisation de
ex
/vi
editor et de l' option globstar (syntaxe similaire àawk
etsed
):où
aaa
est votre point de départ etbbb
votre texte de fin.Pour effectuer une recherche récursive, essayez:
Remarque: pour activer la
**
syntaxe, exécutezshopt -s globstar
(Bash 4 ou zsh).la source