Comment trouver des correspondances de motifs sur plusieurs lignes avec grep
grep est un utilitaire de recherche de texte en ligne de commande capable de trouver des modèles et des chaînes dans des fichiers et d’autres types d’entrées. La plupart des correspondances correspondent à une seule ligne, mais il est souvent utile de faire correspondre plusieurs nouvelles lignes.
Correspondance sur plusieurs nouvelles lignes avec grep
La gestion des correspondances multilignes est quelque chose grep lutte avec. Un meilleur outil pour le travail est awk ou sed, qui gèrent naturellement les entrées multilignes. L’utilisation de deux expressions avec une virgule entre elles correspondra à tout ce qui se trouve entre ces deux modèles.
awk '/from/,/to/' file sed -n '/from/,/to/p' file

Il est toujours possible de gérer cela dans grepcependant, la commande est très maladroite.
grep -Pz '(?s)from.*n.*to' test

Cela fait plusieurs choses :
-PActive l’expression régulière compatible Perl.-zalimente le fichier entier en une seule ligne, avec « zéro octet » au lieu d’une nouvelle ligne. Cela permet à grep de traiter le tout comme une seule ligne.(?s)active PCRE_DOTALL, ce qui rend le.correspond à n’importe quel caractère, y compris les sauts de ligne.fromest le match de départ..*n.*correspondra à tout jusqu’àtoqui est le match de fin.
Dans l’ensemble, cela le fera à des fins de script, mais il y a beaucoup de choses à retenir si vous le tapez vous-même. Aussi, en utilisant le -o flag pour imprimer uniquement la correspondance affichera également un caractère de zéro octet à la fin, ce qui peut causer des problèmes supplémentaires.
Utilisation de pcre2grep à la place (grep compatible Perl)
Habituel grep n’est pas le meilleur outil pour le travail, et il existe une alternative appelée pcre2grep qui prend en charge les expressions régulières compatibles Perl prêtes à l’emploi et est capable de faire correspondre très facilement Regex multiligne.
Il est probablement installé sur votre système, mais si ce n’est pas le cas, vous pouvez l’obtenir auprès de votre gestionnaire de packages :
sudo apt install pcre2-utils
Ensuite, il vous suffit de l’exécuter avec le -M paramètre.
pcre2grep -M 'from(n|.)*to' file

Notez que cela vous oblige toujours à faire correspondre manuellement « nouvelle ligne ou n’importe quel caractère » avec (n|.)* . Alternativement, vous pouvez utiliser le (?s) astuce pour activer PCRE_DOTALL et faire en sorte que le caractère point corresponde également aux nouvelles lignes.
pcre2grep -M '(?s)from.*to' file
