Je voudrais obtenir la correspondance de modèle multiple avec AND implicite entre les modèles, c'est-à-dire l'équivalent d'exécuter plusieurs greps dans une séquence:
grep pattern1 | grep pattern2 | ...
Alors, comment le convertir en quelque chose comme?
grep pattern1 & pattern2 & pattern3
Je voudrais utiliser un seul grep car je construis des arguments de manière dynamique, donc tout doit tenir dans une chaîne. Utiliser filter est une fonctionnalité système, pas grep, donc ce n’est pas un argument.
Ne confondez pas cette question avec:
grep "pattern1\|pattern2\|..."
Ceci est une correspondance multi-motifs OU .
grep
regular-expression
greenoldman
la source
la source
Réponses:
agrep
peut le faire avec cette syntaxe:Avec GNU
grep
, une fois construit avec le support PCRE, vous pouvez faire:Avec ast
grep
:(ajout
.*
s comme<x>&<y>
les chaînes de caractères qui correspondent à la fois<x>
et<y>
exactement ,a&b
ne correspondra jamais à car il n'y a pas une telle chaîne qui peut être à la foisa
etb
en même temps).Si les motifs ne se chevauchent pas, vous pourrez peut-être aussi:
Le meilleur moyen portable est probablement avec
awk
comme déjà mentionné:Avec
sed
:Veuillez noter que tous ceux-ci auront une syntaxe d'expression régulière différente.
la source
agrep
syntaxe ne fonctionne pas pour moi ... dans quelle version a-t-elle été introduite?agrep
peuvent être trouvées incluses avec aperçu / webglimpse . Peut-être que vous avez une implémentation différente. J'ai eu une erreur pour la version ast-grep cependant, l'option pour les regexps augmentés est-X
, pas-A
.agrep
0.8.0 sur Fedora 23. Cela semble être différentagrep
de celui que vous avez mentionné.agrep
.awk '/p1/ && /p2/ {n++}; END {print 0+n}'
Vous n'avez pas spécifié la version de grep, c'est important. Certains moteurs d’expression rationnelle autorisent plusieurs correspondances groupées par AND en utilisant '&', mais il s’agit d’une fonctionnalité non standard et non portable. Mais au moins GNU, grep ne le supporte pas.
OTOH vous pouvez simplement remplacer grep par sed, awk, perl, etc. (énumérés par ordre croissant de poids). Avec awk, la commande ressemblerait à
et il peut être construit pour être spécifié en ligne de commande de manière simple.
la source
awk
utilisation des ERE, par exemple l’équivalent degrep -E
, est différente de celle du BREgrep
.awk
Les regex de sont appelés ERE, mais en fait, ils sont un peu idiosyncratiques. Voici probablement plus de détails que ceux qui s'en soucientawk
, tout simplement en sachant plus, c'est mieux).{ print; }
pièce ne soit pas vraiment nécessaire ou utile ici.Si
patterns
contient un motif par ligne, vous pouvez faire quelque chose comme ceci:Ou cela correspond à des sous-chaînes au lieu d'expressions régulières:
Pour imprimer toutes les entrées au lieu de pas de lignes dans le cas
patterns
vide, remplacerNR==FNR
parFILENAME==ARGV[1]
ou parARGIND==1
dansgawk
.Ces fonctions impriment les lignes de STDIN contenant chaque chaîne spécifiée en tant qu'argument en tant que sous-chaîne.
ga
signifie grep all etgai
ignore la casse.la source
Ce n'est pas une très bonne solution mais illustre un "truc" plutôt cool
la source
chained-grep()
ou l' autre oufunction chained-grep
pasfunction chained-grep()
: unix.stackexchange.com/questions/73750/…git grep
Voici la syntaxe qui consiste à
git grep
combiner plusieurs modèles à l' aide d' expressions booléennes :La commande ci-dessus imprimera des lignes correspondant à tous les motifs à la fois.
Vérifier l'
man git-grep
aide.Voir également:
Pour le fonctionnement OR , voir:
la source
ripgrep
Voici l'exemple utilisant
rg
:C’est l’un des outils de recherche les plus rapides, car il est construit sur le moteur de regex de Rust qui utilise des automates finis, SIMD et des optimisations littérales agressives pour rendre la recherche très rapide.
Voir également la demande de fonctionnalités associée sur GH-875 .
la source
Voici ma prise, et cela fonctionne pour les mots sur plusieurs lignes:
Utilisez
find . -type f
suivi du maximum-exec grep -q 'first_word' {} \;
et du dernier mot clé avec
-exec grep -l 'nth_word' {} \;
-q
-l
fichiers de spectacle silencieux / silencieux avec correspondancesLa liste suivante retourne la liste des noms de fichiers avec les mots "lapin" et "trou":
find . -type f -exec grep -q 'rabbit' {} \; -exec grep -l 'hole' {} \;
la source
Pour rechercher TOUS les mots (ou modèles), vous pouvez exécuter grep dans la boucle FOR . Le principal avantage ici est la recherche dans une liste de regex .
EDITER ma réponse avec un exemple réel:
Maintenant exécutons-le sur ce fichier:
la source
ALL
opérateur, votre code fonctionne commeOR
opérateur, pasAND
. Et d'ailleurs. pour cela (OR
) est une solution beaucoup plus facile étant donné directement dans la question.AND
opérateur, ce qui signifie que le fichier n’est un succès que s’il correspond au modèle A, au modèle B et au modèle C et ...AND
Dans votre cas, le résultat est positif s’il correspond. motif A ou motif B ou ... Voyez-vous la différence maintenant?AND
. Ensuite, vous devez réécrire le script pour qu’il s’exécute sur plusieurs fichiers. Vous réaliserez peut-être que la question a déjà été répondue et que votre tentative n’apporte rien, désolée.