Comment utiliser grep pour 2 lignes différentes

15

Comment puis-je rechercher deux phrases différentes lorsqu'elles sont sur deux lignes différentes en utilisant une seule grepcommande?

Par exemple

Ligne 1: C'est un bonbon.

Ligne 2: citron.

J'ai utilisé ça mais pas de résultat

grep "sweet.*lemon" file_type
Vijay Chakraborty
la source

Réponses:

20

Pour utiliser grepdeux lignes différentes, recherchez les deux modèles

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

Ou utilisez l'alternance

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

Pour obtenir la ligne suivante après un modèle, vous pouvez utiliser l'option contextuelle

$ grep -A1 sweet file_type
This is a sweet
lemon.

Mais si vous recherchez explicitement un modèle multiligne, qui est parce que délicate greppense en lignes ... . Votre .*attrapera tout entre "sucré" et "citron" sur la ligne . Nous pouvons obtenir "citron" sur la ligne suivante en -Putilisant \npour faire correspondre la nouvelle ligne et en disant que greple fichier est nul avec -z:

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

Remarques:

  • -EUtilisez des expressions régulières étendues (pour utiliser le |caractère pour l'alternance sans avoir besoin de l'échapper)
  • -An Imprimer des lignes supplémentaires après le motif, où n est le nombre de lignes de fin à imprimer
  • -PUtilisez des expressions régulières de style perl («expérimental» dans grep- installer à la pcregrepplace pour une meilleure prise en charge des expressions rationnelles perl)
  • -zUtilisez le caractère nul comme séparateur (prétendant juste dans ce cas, mais grepnous prendrons notre parole)
  • -o imprimer uniquement la partie correspondante
Zanna
la source
Alors que la grep -zPcommande fonctionnerait dans ce cas spécifique (un fichier composé exactement de deux lignes), elle considérerait en général tout fichier ordinaire séparé par des sauts de ligne comme une seule ligne, donc soit vider tout le contenu du fichier (s'il y a une correspondance quelque part) ou rien; ce n'est généralement pas ce que les gens utilisent grep.
Marc van Leeuwen
ouais ce n'est utile qu'avec -o... édité ...
Zanna
Dans le cas où cela est essayé sur d'autres distributions, vous pouvez rencontrer: grep: The -P and -z options cannot be combined- par exemple grep (GNU grep) 2.5.1 sur RHEL
Jason Pyeron
6

Comme ça:

grep "sweet\|lemon"
madneon
la source
désolé mais cela correspondra exactement à "sweet | lemon"
αғsнιη
4
@KasiyA Cette ligne fonctionne bien. greppar des œuvres par défaut en mode « standard », où « caractères spéciaux » comme |, +, *sont interprétés littéralement à moins qu'ils masqués par une barre oblique inverse. Voir par exemple cette réponse . Pour utiliser la façon dont vous êtes probablement habitué, que les "caractères spéciaux" doivent être masqués pour être interprétés littéralement, vous devez passer en "mode étendu" ( grep -E). Peut-être que madneon pourrait élaborer un peu plus sur ses réponses, par exemple ce que les PO auraient essayé ?
Henning Kockerbeck