grep:组捕获
我有以下string:
{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}
我需要得到“scheme version”的值,在这个例子中是1234。
我努力了
grep -Eo "\"scheme_version\":(\w*)"
然而它返回
"scheme_version":1234
我怎样才能做到这一点? 我知道我可以添加sed调用,但我更喜欢用单个grep来完成。
这可能适合你:
echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | sed -n 's/.*"scheme_version":\([^}]*\)}/\1/p' 1234
对不起,这不是grep ,所以如果你喜欢的话,不要理会这个解决scheme。
或者坚持grep并添加:
grep -Eo "\"scheme_version\":(\w*)"| cut -d: -f2
你需要在断言之后使用一下,以便它不包含在匹配中:
grep -Po '(?<=scheme_version":)[0-9]+'
我build议你使用jq作为工作。 jq是一个命令行的JSON处理器。
$ cat tmp {"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234} $ cat tmp | jq .scheme_version 1234
作为SiegeXbuild议的正向反序列方法的一种替代方法,你可以将匹配起始点重置为scheme_version":
在scheme_version":
\K
转义序列之后”。例如,
$ grep -Po 'scheme_version":\K[0-9]+'
匹配scheme_version":
之后,匹配过程重新开始,并且往往比正向scheme_version":
有更好的性能。比较regexp101和regexp101之间的匹配启动方法需要37个步骤和1ms,而正向lookbehind方法需要194个步骤和21ms。
您可以在regex101上比较自己的performance,您可以阅读更多关于在PCRE文档中重置匹配起点的信息 。
你可以这样做:
$ echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | awk -F ':' '{print $4}' | tr -d '}'