Не удается извлечь группу захвата без sed или grep

Я хочу извлечь пару значений из синтаксиса пары ключ-значение, но я не могу. Пример, который я попробовал:

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

Но это дает employee_id=1234, а не 1234, который фактически является группой захвата.

Что я здесь делаю неправильно? Я также пробовал:

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

но без успеха.

Ответы

Ответ 1

1. Используйте egrep -o:

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

2. используя grep -oP (PCRE):

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

3. Используя sed:

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

Ответ 2

Чтобы расширить номер ответа anubhava 2, общий шаблон для grep возвращает только группу захвата:

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

так

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

Ответ 3

Используя awk

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

Ответ 4

Вы специально запрашиваете sed, но в случае, если вы можете использовать что-то еще - любая совместимая с POSIX оболочка может выполнять расширение параметра, не требующее fork/subshell:

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

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