web-dev-qa-db-fra.com

Est-ce que GNU Grep peut sortir un groupe sélectionné?

Est-il possible d'utiliser GNU grep pour obtenir un groupe correspondant à partir d'une expression?

Exemple:

echo "foo 'bar'" | grep -oE "'([^']+)'"

Ce qui produirait "'bar'". Mais je voudrais juste avoir "bar", sans avoir à l'envoyer par le biais de grep une fois de plus (c'est-à-dire obtenir le groupe correspondant). Est-ce possible?

46
Torandi

Vous pouvez utiliser sed pour cela. Sur BSD sed:

echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"

Ou, sans l'option -E:

sed "s/.*'\([^']\+\)'.*/\1/"

Cela ne fonctionne pas pour une entrée multiligne. Pour cela vous avez besoin de:

sed -n "s/.*'\([^']\+\)'.*/\1/p"
49
jtbandes

Bien que grep ne puisse pas générer de groupe spécifique, vous pouvez utiliser des assertions lookahead et behind pour obtenir ce que votre après:

echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"

28
Aldrik

Vous pouvez utiliser \K pour réinitialiser et ignorer le texte de correspondance de gauche avec un lookahead qui n'est pas ajouté au texte de correspondance:

$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar

GNU grep uniquement.

2
drewk