我想从键值对语法中提取键值对,但我做不到。
我尝试的示例:
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]+)
但是没有成功。
我想从键值对语法中提取键值对,但我做不到。
我尝试的示例:
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
employee_id=
后面的数字;第二个根本不起作用;第三个选择了数字,如果我修改它,就会得到我所需的结果,但与我的不同之处在于你在数字部分使用了*
,而我使用的是+
。这为什么很重要? - Jimsed -r
或 sed -E
的扩展正则表达式中使用。 - anubhavaphp -v | grep -P -o "^PHP\s\K([0-9]{1}\.?[0-9]{0,2}\.?[0-9]{0,2})\s"
。 - turrican_34\K
是什么作用? - Nae\K
是一个PCRE指令,用于重置所有匹配信息。 - anubhava为了进一步解释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)"
使用 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