Comment donner un motif pour une nouvelle ligne dans grep? Nouvelle ligne au début, nouvelle ligne à la fin. Pas le moyen d'expression régulière. Quelque chose comme\n.
Les modèles grep
sont comparés à des lignes individuelles; il est donc impossible pour un modèle 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
:
pcregrep -M "pattern1.*\n.*pattern2" filename
l'option -M
lui permet de correspondre sur plusieurs lignes, vous pouvez donc rechercher des nouvelles lignes en tant que \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
correspond aux espaces blancs; si suivi de *
, il correspond également à une ligne vide.^
correspond au début de la ligne. $
correspond à la fin de la ligne.Grâce à @jarno, je connais l'option -z et j'ai découvert qu'en utilisant GNU grep avec l'option -P, la correspondance avec \n
est possible . :)
Exemple:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
Imprime bar
En ce qui concerne la solution de contournement (sans utiliser -P
non portable), vous pouvez remplacer temporairement un caractère de nouvelle ligne par un autre et le rétablir, par exemple:
grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
Fondamentalement, il recherche une correspondance exacte _foo_
où _
signifie \n
(donc __
= \n\n
). Vous n'êtes pas obligé de le traduire à nouveau par tr '_' '\n'
, car chaque motif serait imprimé dans la nouvelle ligne, de sorte que supprimer _
suffit.
viens juste de trouver
grep $'\r'
Il utilise $'\r'
pour une évasion de style c dans Bash.
dans cet article