240 votes

Grep non gourmand

Je veux récupérer la correspondance la plus courte et le modèle devrait être quelque chose comme.. :

<car ... model=BMW ...>
...
...
...
</car>

... signifie n'importe quel caractère et l'entrée est constituée de plusieurs lignes.

8 votes

1voto

jlopes Points 11

La réponse courte est d'utiliser l'expression régulière suivante :

(?s)<car .*? model=BMW .*?>.*?</car>
  • (?s) - cela permet d'établir une correspondance entre plusieurs lignes.
  • .* ? - correspond à n'importe quel caractère, un certain nombre de fois de manière paresseuse (correspondance minimale correspondance)

Une réponse (un peu) plus compliquée est :

(?s)<([a-z\-_0-9]+?) .*? model=BMW .*?>.*?</\1>

Cela permettra de faire correspondre voiture1 et voiture2 dans le texte suivant

<car1 ... model=BMW ...>
...
...
...
</car1>
<car2 ... model=BMW ...>
...
...
...
</car2>
  • ( ) représente un groupe de capture
  • \1 dans ce contexte, correspond au même texte que le plus récent correspondant à le groupe de capture numéro 1

-2voto

user200850 Points 99

Je sais que c'est un peu un post mort, mais je viens de remarquer que cela fonctionne. Il a supprimé à la fois clean-up et cleanup de ma sortie.

> grep -v -e 'clean\-\?up'
> grep --version grep (GNU grep) 2.20

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