Regex 无法使用sed或grep提取捕获组

Regex 无法使用sed或grep提取捕获组,regex,linux,sed,grep,Regex,Linux,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。使用grep-Eo:(因为不推荐使用egrep) 2。使用grep-oP(PCRE): ech

我想从键值对语法中提取值对,但我不能。
我试过的例子:

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。使用
grep-Eo
(因为不推荐使用
egrep

2。使用
grep-oP
(PCRE):

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

1234
3。使用
sed

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

1234
echo'employee\u id=1234'| sed's/^.*employee\u id=\([0-9][0-9]*\).$/\1/'
1234
使用
awk

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

您特别要求使用
sed
,但如果您可能使用其他东西,任何符合POSIX的shell都可以进行参数扩展,而不需要fork/subshell:

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


要扩展anubhava的答案编号2,让grep只返回捕获组的一般模式是:

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


对扩展正则表达式使用sed-E

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

你的答案都不相关。第一个我不能使用,因为我只需要
employee\u id=
后面的数字,第二个根本不起作用,第三个选择数字,如果我修改它,它会给出我需要的,但与我的不同之处在于,当我使用
+
时,你在数字部分使用
*
。为什么这很重要?
+
只允许在扩展正则表达式中使用
sed-r
sed-E
2,这是一种让PHP版本在Ansible playbook
PHP-v | grep-P-o“^PHP\s\K([0-9]{1}.[0-9]{0,2}.[0-9]{0,2}.[0-9]{0,2}”)中使用的方法
什么是
\K
做的?@Nae:
\K
是重置所有匹配信息的PCRE指令。AFAIK sed不支持“+”量词。相反,您必须像anubhava在其回答中那样,键入前一项两次:[0-9][0-9]*。echo'employee_id=1234'| cut-d'='-f 2可能重复
# 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)"
    echo employee_id=1234 | sed -E 's/employee_id=([0-9]+)/\1/g'