Comment donner un motif à une nouvelle ligne dans grep?

Comment donner un motif à une nouvelle ligne dans grep? Nouvelle ligne au début, nouvelle ligne à la fin. Pas la manière d’expression régulière. Quelque chose comme \ n.

grep motifs de grep sont mis en correspondance avec des lignes individuelles, de sorte qu’il est impossible pour un motif de correspondre à une nouvelle ligne trouvée dans l’entrée.

Cependant, vous pouvez trouver des lignes vides comme ceci:

 grep '^$' file grep '^[[:space:]]*$' file # include white spaces 

essayez pcregrep au lieu de grep normal:

 pcregrep -M "pattern1.*\n.*pattern2" filename 

l’option -M permet de correspondre à plusieurs lignes, vous pouvez donc rechercher les nouvelles lignes sous la forme \n .

Vous pouvez utiliser cette façon …

 grep -P '^\s$' file 
  • -P est utilisé pour les expressions régulières Perl (une extension de POSIX grep ).
  • \s correspondent aux caractères d’espace blanc; suivie de * , elle correspond également à une ligne vide.
  • ^ correspond au début de la ligne. $ correspond à la fin de la ligne.

Comme pour la solution de contournement (sans utiliser -P non-portable), vous pouvez remplacer temporairement un caractère de nouvelle ligne par un autre et le modifier, par exemple:

 grep -o "_foo_" <(paste -sd_ file) | tr -d '_' 

Fondamentalement, il cherche la correspondance exacte _foo__ signifie \n (donc __ = \n\n ). Vous n'avez pas besoin de le traduire par tr '_' '\n' , car chaque motif serait de toute façon imprimé dans la nouvelle ligne, alors supprimer _ suffit.

Grâce à @jarno, je connais l’option -z et j’ai découvert que lors de l’utilisation de GNU grep avec l’option -P, la comparaison avec \n est possible . 🙂

Exemple:

grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

Imprime la bar