Comment grep rechercher des noms de fichiers au lieu de contenu sous Linux
Agence web » Actualités du digital » Comment trouver des correspondances de motifs sur plusieurs lignes avec grep

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 :

  • -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’à 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

★★★★★