Can not extract the capture group with either sed or grep

RegexLinuxSedGrep

Regex Problem Overview


I want to extract the value pair from a key-value pair syntax but I can not.
Example I tried:

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

But this gives employee_id=1234 and not 1234 which is actually the capture group.

What am I doing wrong here? I also tried:

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

but no success.

Regex Solutions


Solution 1 - Regex

1. Use grep -Eo: (as egrep is deprecated)

echo 'employee_id=1234' | grep -Eo '[0-9]+'

1234

2. using grep -oP (PCRE):

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

1234

3. Using sed:

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

1234

Solution 2 - Regex

To expand on anubhava's answer number 2, the general pattern to have grep return only the capture group is:

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

so

# 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)"

Solution 3 - Regex

Using awk

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

Solution 4 - Regex

use sed -E for extended regex

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

Solution 5 - Regex

You are specifically asking for sed, but in case you may use something else - any POSIX-compliant shell can do parameter expansion which doesn't require a fork/subshell:

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

 

$ echo "var=${var} value=${value}"
var=employee_id value=1234

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJimView Question on Stackoverflow
Solution 1 - RegexanubhavaView Answer on Stackoverflow
Solution 2 - RegexjayfloView Answer on Stackoverflow
Solution 3 - RegexJotneView Answer on Stackoverflow
Solution 4 - Regexcommander GhostView Answer on Stackoverflow
Solution 5 - RegexAdrian FrühwirthView Answer on Stackoverflow