J'ai essayé de trouver un moyen de filtrer une ligne contenant les mots "citron" et "riz". Je sais comment trouver "citron" ou "riz" mais pas les deux. Il n'est pas nécessaire qu'ils soient l'un à côté de l'autre, mais simplement sur la même ligne de texte.
Réponses
Trop de publicités?"Les deux sur la même ligne" signifie "'riz' suivi de caractères aléatoires suivis de 'citron' ou l'inverse".
En regex, c'est rice.*lemon
o lemon.*rice
. Vous pouvez combiner cela en utilisant un |
:
grep -E 'rice.*lemon|lemon.*rice' some_file
Si vous voulez utiliser des expressions rationnelles au lieu d'expressions étendues ( -E
) vous avez besoin d'une barre oblique inversée avant le |
:
grep 'rice.*lemon\|lemon.*rice' some_file
Pour plus de mots, cela devient vite un peu long et il est généralement plus facile d'utiliser plusieurs appels de grep
par exemple :
grep rice some_file | grep lemon | grep chicken
Vous pouvez envoyer la sortie de la première commande grep à une autre commande grep et cela correspondra aux deux modèles. Donc, vous pouvez faire quelque chose comme :
grep <first_pattern> <file_name> | grep <second_pattern>
ou,
cat <file_name> | grep <first_pattern> | grep <second_pattern>
Exemple :
Ajoutons du contenu à notre fichier :
$ echo "This line contains lemon." > test_grep.txt
$ echo "This line contains rice." >> test_grep.txt
$ echo "This line contains both lemon and rice." >> test_grep.txt
$ echo "This line doesn't contain any of them." >> test_grep.txt
$ echo "This line also contains both rice and lemon." >> test_grep.txt
Que contient le fichier :
$ cat test_grep.txt
This line contains lemon.
This line contains rice.
This line contains both lemon and rice.
This line doesn't contain any of them.
This line also contains both rice and lemon.
Maintenant, nous allons grep ce que nous voulons :
$ grep rice test_grep.txt | grep lemon
This line contains both lemon and rice.
This line also contains both rice and lemon.
Nous n'obtenons que les lignes où les deux modèles correspondent. Vous pouvez étendre cette méthode et envoyer la sortie vers une autre commande grep pour obtenir d'autres correspondances "AND".
Une autre idée pour trouver les correspondances dans n'importe quel ordre est d'utiliser :
grep avec -P
(Compatibilité avec Perl) et l'option regex de lookahead positif (?=(regex))
:
grep -P '(?=.*?lemon)(?=.*?rice)' infile
o que vous pouvez utiliser ci-dessous, à la place :
grep -P '(?=.*?rice)(?=.*?lemon)' infile
- Le site
.*?
signifie la correspondance de tous les caractères.
qui se produit zéro fois ou plus*
alors qu'ils sont facultatifs et suivis d'un motif(rice
olemon
). Le site?
rend tout ce qui est optionnel avant lui (signifie zéro ou une fois de tout ce qui est assorti)..*
)
(?=pattern)
: Lookahead positif : La construction d'un lookahead positif est une paire de parenthèses, la parenthèse ouvrante étant suivie d'un point d'interrogation et d'un signe égal.
Cela renverra donc toutes les lignes qui contiennent à la fois lemon
y rice
dans un ordre aléatoire. Cela permet également d'éviter d'utiliser |
et doublé grep
s.
Liens externes :
<a href="http://caspar.bgsu.edu/%7Ecourses/Stats/Labs/Handouts/grepadvanced.htm" rel="noreferrer">Sujets avancés de Grep</a><br><a href="http://carijansen.com/2013/03/03/positive-lookahead-grep-for-designers/" rel="noreferrer">Lookahead positif - GREP pour les concepteurs</a>
- Réponses précédentes
- Plus de réponses