grep:组捕获

我有以下string:

{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234} 

我需要得到“scheme version”的值,在这个例子中是1234。

我努力了

 grep -Eo "\"scheme_version\":(\w*)" 

然而它返回

 "scheme_version":1234 

我怎样才能做到这一点? 我知道我可以添加sed调用,但我更喜欢用单个grep来完成。

5 Solutions collect form web for “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 '}' 
  • 在Linux中更改默认shell
  • 我如何构build一个本机(命令行)可执行文件在Android上运行?
  • 疑难解答PHP邮件
  • linux cron作业应该用“&”来指定在后台运行吗?
  • 在enum中定义这些#define的目的是什么?
  • 获取MAC地址
  • 分叉的subprocess使用相同的信号量吗?
  • 如何让Windows像Linux一样快速编译C ++?
  • 如何从父进程获取subprocess
  • 将用户添加到Docker容器
  • 在插入模式下破解的Linux vi箭头键