60 votes

GNU Grep peut-il 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 donnerait "'bar'". Mais j'aimerais n'obtenir que "bar", sans avoir à passer par grep une fois de plus (c'est-à-dire obtenir le groupe correspondant). Cela est-il possible ?

58voto

Ryan Fox Points 5181

Vous pouvez utiliser sed pour cela. Sur BSD sed :

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

Ou, sans le -E option :

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

Cela ne fonctionne pas pour les entrées multilignes. Pour cela, vous avez besoin de :

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

31voto

Parsingphase Points 382

Bien que grep ne puisse pas afficher un groupe spécifique, vous pouvez utiliser les assertions lookahead et behind pour obtenir ce que vous recherchez :

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

8voto

jpm Points 5933

Vous pouvez utiliser \K pour réinitialiser et rejeter 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.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X