Je souhaite obtenir la correspondance multi-modèle avec AND implicite entre les motifs, c'est-à-dire équivalent à 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 parce que je construis des arguments dynamiquement, donc tout doit tenir dans une seule chaîne. L'utilisation du filtre est une fonctionnalité système, pas grep, donc ce n'est pas un argument pour cela.
Ne confondez pas cette question avec :
grep "pattern1|pattern2|..."
Ceci est un OU correspondance de motifs multiples.
Réponse acceptée :
agrep
peut le faire avec cette syntaxe :
agrep 'pattern1;pattern2'
Avec GNU grep
, lorsqu'il est construit avec le support PCRE, vous pouvez faire :
grep -P '^(?=.*pattern1)(?=.*pattern2)'
Avec le dernier grep
:
grep -X '.*pattern1.*&.*pattern2.*'
(en ajoutant .*
s comme <x>&<y>
correspond aux chaînes qui correspondent à la fois à <x>
et <y>
exactement , a&b
ne correspondrait jamais car il n'y a pas une telle chaîne qui peut être à la fois a
et b
en même temps).
Si les motifs ne se chevauchent pas, vous pouvez également faire :
grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
Le meilleur moyen portable est probablement avec awk
comme déjà mentionné :
awk '/pattern1/ && /pattern2/'
Avec sed
:
sed -e '/pattern1/!d' -e '/pattern2/!d'
Veuillez noter que tous ceux-ci auront une syntaxe d'expression régulière différente.