我想从键值对语法中提取值对,但我不能。
我试过的例子:
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
推荐使用)
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
为了扩展 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)"
使用awk
echo 'employee_id=1234' | awk -F= '{print $2}'
1234
使用 sed -E 扩展正则表达式
echo employee_id=1234 | sed -E 's/employee_id=([0-9]+)/\1/g'
您特别要求sed
,但如果您可以使用其他东西 - 任何符合 POSIX 的 shell 都可以进行不需要 fork/subshell 的参数扩展:
foo='employee_id=1234'
var=${foo%%=*}
value=${foo#*=}
$ echo "var=${var} value=${value}"
var=employee_id value=1234