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

时间:2013-09-19 10:52:37

标签: 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]+)

但没有成功。

5 个答案:

答案 0 :(得分:75)

<强> 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

答案 1 :(得分:21)

要扩展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)"

答案 2 :(得分:6)

使用awk

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

答案 3 :(得分: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

答案 4 :(得分:3)

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

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