我想从键值对语法中提取值对,但我不能 我试过的例子:
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]+)
但没有成功。
答案 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 / subshell:
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'