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_
où _
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