web-dev-qa-db-fra.com

Comment donner un motif pour une nouvelle ligne dans grep?

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.

66
tuxnani

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 
68
arash kordi

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.

75
nullrevolution

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.
19
Mani R

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

12
rubystallion

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__ 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.

6
kenorb

viens juste de trouver

grep $'\r'

Il utilise $'\r' pour une évasion de style c dans Bash.

dans cet article

2
HHHartmann