Не удается извлечь группу захвата без 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