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

56

我想从键值对语法中提取键值对,但我做不到。
我尝试的示例:

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
据我所知,sed不支持“+”量词。相反,您必须将前一个项目输入两次:[0-9] [0-9]*,就像anubhava在他的答案中所做的那样。 - Panos Rontogiannis
1
可能是如何在Mac OS X(BSD)的sed中转义加号?的重复问题。 - Michael Foukarakis
echo 'employee_id=1234' | cut -d '=' -f 2 - ALex_hha
5个回答

108

1. 使用grep -Eo(由于egrep已被弃用)

echo 'employee_id=1234' | grep -Eo '[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
你的回答都不相关。第一个我不能使用,因为我只需要employee_id=后面的数字;第二个根本不起作用;第三个选择了数字,如果我修改它,就会得到我所需的结果,但与我的不同之处在于你在数字部分使用了*,而我使用的是+。这为什么很重要? - Jim
“+” 只能在使用 sed -rsed -E 的扩展正则表达式中使用。 - anubhava
1
2 对我来说是一种获取用于 Ansible playbook 的 PHP 版本的方法:php -v | grep -P -o "^PHP\s\K([0-9]{1}\.?[0-9]{0,2}\.?[0-9]{0,2})\s" - turrican_34
\K 是什么作用? - Nae
4
@Nae: \K 是一个PCRE指令,用于重置所有匹配信息。 - anubhava

34

为了进一步解释anubhava的第二个答案,使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)"

6

使用 awk

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

5

使用sed -E来进行扩展正则表达式匹配。

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

4

你特别要求使用sed,但是如果可能使用其他内容-任何符合POSIX标准的shell都可以执行参数扩展而不需要fork/subshell:

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

 

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接