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?
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"
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 "(?<=')[^']+(?=')"
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.