123 votes

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 à la manière d'une expression régulière. Quelque chose comme \n.

110voto

nullrevolution Points 3517

Essayez pcregrep au lieu de l'habituel grep :

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

le site -M permet de rechercher sur plusieurs lignes, de sorte que vous pouvez rechercher les retours à la ligne en tant que \n .

103voto

arash kordi Points 1802

grep Les motifs sont comparés à des lignes individuelles, il n'y a donc aucun moyen pour un motif de correspondre à une nouvelle ligne trouvée dans l'entrée.

Cependant, vous pouvez trouver des lignes vides comme celle-ci :

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

34voto

rubystallion Points 1043

Grâce à @jarno, je connais l'option -z et je l'ai découvert en utilisant GNU grep avec l'option -P, la comparaison avec \n est possible . :)

Ejemplo:

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

Résultat :

bar

Exemple qui consiste à faire correspondre tout, y compris les nouvelles lignes :

.* ne correspondra pas aux nouvelles lignes. Pour faire correspondre tout, y compris les nouvelles lignes, utilisez 1 (.|\n)* :

grep -zoP 'foo\n\K(.|\n)*'<<<$'foo\nbar\nqux'

Résultat :

bar
qux

1 Vu ici : https://stackoverflow.com/a/33418344

26voto

Mani BK sys Points 318

Vous pouvez utiliser ce moyen...

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 ; s'ils sont suivis par * il correspond également à une ligne vide.
  • ^ correspond au début de la ligne. $ correspond à la fin de la ligne.

7voto

kenorb Points 2464

Pour ce qui est de la solution de contournement (sans utiliser la solution non portable -P ), vous pouvez remplacer temporairement un caractère de nouvelle ligne par le caractère différent et le modifier à nouveau, par ex :

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

En gros, il cherche une correspondance exacte _foo_ donde _ signifie \n (donc __ = \n\n ). Il n'est pas nécessaire de le retraduire en tr '_' '\n' car chaque motif serait de toute façon imprimé dans la nouvelle ligne, et la suppression de l'option _ est suffisant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X