web-dev-qa-db-fra.com

Comment utiliser grep pour 2 lignes différentes

Comment puis-je rechercher deux phrases différentes lorsqu'elles se trouvent sur deux lignes différentes à l'aide d'une seule commande grep?

Par exemple

Ligne 1: C'est un bonbon.

Ligne 2: citron.

Je l'ai utilisé mais aucun résultat

grep "sweet.*lemon" file_type
13
Vijay Chakraborty

Pour utiliser greppour deux 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 de contexte

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

Mais si vous recherchez explicitement un modèle multiligne, c'est délicat car greppense en lignes ... . Votre .* interceptera tout ce qui se situe entre "sweet" et "citron" sur la ligne . Nous pouvons obtenir "citron" sur la ligne suivante avec -P, en utilisant \n pour faire correspondre la nouvelle ligne et en indiquant à greple fichier est null, séparé par -z:

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

Remarques:

  • -E Utilisez des expressions régulières étendues (utiliser le caractère | pour une alternance sans avoir besoin de l'échapper)
  • -An Imprime des lignes supplémentaires après le motif, n étant le nombre de lignes de fin à imprimer.
  • -P Utilisez des expressions régulières de style Perl ("expérimental" dans grep- installez pcregrepà la place pour une meilleure prise en charge des expressions rationnelles Perl)
  • -z Utilisez le caractère nul en tant que séparateur (dans ce cas, faites semblant, mais grepprendra notre mot pour cela)
  • -o n'imprime que la partie correspondante
19
Zanna

Comme ça:

grep "sweet\|lemon"
5
madneon