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.
Réponses
Trop de publicités?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
Vous pouvez utiliser ce moyen...
grep -P '^\s$' file
-
-P
est utilisé pour les expressions régulières Perl (une extension de POSIXgrep
). -
\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.
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.
- Réponses précédentes
- Plus de réponses