Est-il possible d'utiliser GNU grep pour obtenir un groupe mis en correspondance à 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?
grep
's -E: "Interprète les expressions régulières comme des expressions régulières étendues (modernes) plutôt que des expressions régulières de base (BRE). La page de manuel re_format (7) décrit complètement les deux formats."( ) +
utiliser\( \) \+
: C'est en fait la même chose:sed "s/.*'\([^']\+\)'.*/\1/"
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:
la source
grep -P
n'est pas disponible sur toutes les plateformes. Mais si c'est le cas, utiliser lookahead / behind est un très bon moyen de résoudre le problème.Vous pouvez utiliser
\K
pour réinitialiser et supprimer le texte de correspondance de la main gauche avec un préfixe qui n'est pas ajouté au texte de correspondance:GNU grep uniquement.
la source