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 '}'