J'ai essayé de trouver un moyen de filtrer une ligne contenant les mots "citron" et "riz". Je sais comment trouver du "citron" ou du "riz" mais pas les deux. Ils n'ont pas besoin d'être l'un à côté de l'autre, mais sur la même ligne de texte.
text-processing
grep
Sébastien
la source
la source
Réponses:
"Les deux sur la même ligne" signifient "" riz "suivi de caractères aléatoires suivis de" citron "ou inversement".
En regex c'est
rice.*lemon
oulemon.*rice
. Vous pouvez combiner cela en utilisant un|
:Si vous voulez utiliser des expressions rationnelles normales au lieu de celles étendues (
-E
), vous devez insérer une barre oblique inverse avant le|
:Pour plus de mots qui deviennent rapidement un peu longs et il est généralement plus facile d'utiliser plusieurs appels de
grep
, par exemple:la source
grep rice
lignes de recherche contenantrice
. Il est alimenté dansgrep lemon
lequel vous trouverez uniquement des lignes contenant du citron .. et ainsi de suite. Alors que le PO - ainsi que vos réponses précédentes - autorisent n'importe lequel des [riz | citron | poulet]|
faut fuirgrep
? Merci!egrep
utilise l'expression rationnelle étendue où|
est comprise comme logique OU.grep
La valeur par défaut est regex basic, où\|
est ORgrep
la page de manuel de,egrep
est obsolète et doit être remplacé pargrep -E
. J'ai pris la liberté de modifier la réponse en conséquence.Vous pouvez diriger le résultat de la première commande grep vers une autre commande grep, ce qui correspond aux deux modèles. Donc, vous pouvez faire quelque chose comme:
ou,
Exemple:
Ajoutons du contenu à notre fichier:
Que contient le fichier:
Maintenant, passons à ce que nous voulons:
Nous n'obtenons que les lignes où les deux modèles correspondent. Vous pouvez étendre cela et diriger la sortie vers une autre commande grep pour d'autres correspondances "AND".
la source
Bien que la question demande "grep", j'ai pensé qu'il pourrait être utile de poster une solution simple "awk":
Cela peut facilement être étendu avec plus de mots, ou d'autres expressions booléennes en plus de 'et'.
la source
Une autre idée pour trouver les correspondances dans n'importe quel ordre utilise:
grep avec l' option
-P
(Compatibilité Perl) et une expression positive d'anticipation(?=(regex))
:ou vous pouvez utiliser ci-dessous à la place:
.*?
moyens d' adaptation des caractères.
qui occurrences zéro ou plusieurs fois*
alors qu'ils sont en option suivie par un motif (rice
oulemon
). Le?
rend tout facultatif avant (signifie zéro ou une fois tout ce qui est assorti.*
)(?=pattern)
: Lookahead positif: la construction de lookahead positive consiste en une paire de parenthèses, la parenthèse ouvrante étant suivie d'un point d'interrogation et d'un signe égal.Donc, cela retournera toutes les lignes avec contient les deux
lemon
etrice
dans un ordre aléatoire. Cela évitera également d'utiliser|
s et doublégrep
s.Liens externes: Sujets Grep avancés - Aspect positif - GREP pour les concepteurs
la source
Rendra les matchs pour foo ou goo
la source
Si nous admettons qu'il
grep
est acceptable de fournir une réponse non fondée, tout comme la réponse ci-dessusawk
, je proposerais uneperl
ligne simple telle que:La recherche peut être ignorante avec certains / tous les mots tels que
/lemon/i and /rice/i
. Sur la plupart des machines Unix / Linux, perl est installé aussi bien que awk.la source
Voici un script pour automatiser la solution de canalisation grep:
la source
eval
renvoyer, ce qui casse facilement