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]+)

但没有成功。

4

5 回答 5

106

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
于 2013-09-19T10:56:16.293 回答
34

为了扩展 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)"
于 2016-04-06T15:34:43.240 回答
6

使用awk

echo 'employee_id=1234' | awk -F= '{print $2}'
1234
于 2013-09-19T11:29:47.873 回答
5

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

    echo employee_id=1234 | sed -E 's/employee_id=([0-9]+)/\1/g'
于 2018-11-20T05:34:55.180 回答
4

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

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

 

$ echo "var=${var} value=${value}"
var=employee_id value=1234
于 2013-09-19T14:00:26.823 回答