web-dev-qa-db-fra.com

Impossible d'extraire le groupe de capture sans sed ni grep

Je souhaite extraire la paire de valeurs d'une syntaxe de paire clé-valeur, mais je ne peux pas.
Exemple que j'ai essayé:

echo employee_id=1234 | sed 's/employee_id=\([0-9]+\)/\1/g'

Mais cela donne employee_id=1234 et pas 1234 qui est en fait le groupe de capture.

Qu'est-ce que je fais mal ici? J'ai aussi essayé:

echo employee_id=1234| egrep -o employee_id=([0-9]+)

mais pas de succès.

41
Jim

1. Utilisez egrep -o:

echo 'employee_id=1234' | egrep -o '[0-9]+'
1234

2. En utilisant grep -oP (PCRE):

echo 'employee_id=1234' | grep -oP 'employee_id=\K([0-9]+)'
1234

. En utilisant sed:

echo 'employee_id=1234' | sed 's/^.*employee_id=\([0-9][0-9]*\).*$/\1/'
1234
82
anubhava

Pour développer le numéro de réponse d'un anubhava 2, le modèle général pour que grep retourne uniquement le groupe de capture est:

$ regex="$precedes_regex\K($capture_regex)(?=$follows_regex)"
$ echo $some_string | grep -oP "$regex"

alors

# matches and returns b
$ echo "abc" | grep -oP "a\K(b)(?=c)" 
b 
# no match
$ echo "abc" | grep -oP "z\K(b)(?=c)"
# no match
$ echo "abc" | grep -oP "a\K(b)(?=d)"
21
jayflo

Utilisation de awk

echo 'employee_id=1234' | awk -F= '{print $2}'
1234
6
Jotne

Vous demandez spécifiquement sed, mais au cas où vous pourriez utiliser autre chose - n'importe quel Shell compatible POSIX peut faire une expansion de paramètre qui ne nécessite pas de fork/subshell:

foo='employee_id=1234'
var=${foo%%=*}
value=${foo#*=}

$ echo "var=${var} value=${value}"
var=employee_id value=1234
4
Adrian Frühwirth

utilisez sed -E pour regex étendu

    echo employee_id=1234 | sed -E 's/employee_id=([0-9]+)/\1/g'
3
commander Ghost