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 grep
cependant, la commande est très maladroite.
grep -Pz '(?s)from.*n.*to' test
Cela fait plusieurs choses :
-P
Active l’expression régulière compatible Perl.-z
alimente 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.from
est le match de départ..*n.*
correspondra à tout jusqu’àto
qui 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