grep:组捕获

时间:2011-12-22 10:56:53

标签: regex linux bash grep

我有以下字符串:

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

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

我试过了

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

然而它返回

"scheme_version":1234

我该怎么做?我知道我可以添加 sed 调用,但我更愿意使用单个grep。

7 个答案:

答案 0 :(得分:60)

您需要使用断言后面的内容,以便它不包含在匹配中:

grep -Po '(?<=scheme_version":)[0-9]+'

答案 1 :(得分:49)

这可能对您有用:

echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' |
sed -n 's/.*"scheme_version":\([^}]*\)}/\1/p'
1234

对不起,它不是 grep ,所以如果你愿意,请忽略这个解决方案。

或坚持使用grep并添加:

grep -Eo "\"scheme_version\":(\w*)"| cut -d: -f2

答案 2 :(得分:37)

我建议你使用jq来完成这项工作。 jq是一个命令行JSON处理器。

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

$ cat tmp | jq .scheme_version
1234

答案 3 :(得分:23)

作为SiegeX建议的正向lookbehind方法的替代方法,您可以将匹配起点重置为scheme_version":之后的\K转义序列。如,

$ grep -Po 'scheme_version":\K[0-9]+'

这在匹配scheme_version":后重新开始匹配过程,并且往往具有比积极外观更好的性能。比较regexp101上的两个表明复位匹配开始方法需要37步和1ms,而正向后看方法需要194步和21ms。

您可以在regex101上自行比较效果,然后您可以阅读有关重置PCRE documentation中匹配起点的更多信息。

答案 4 :(得分:4)

为避免使用GNU grepBSD versionripgrep中未提供的grep PCRE功能,另一种方法是使用json.tool module,例如

$ rg -o 'scheme_version.?:(\d+)' -r '$1' <file.json 
1234
  

-r捕获群组索引(例如$5)和名称(例如$foo)。

Python和Can grep output only specified groupings that match?的另一个例子,可以验证和漂亮打印:

$ python -mjson.tool file.json | rg -o 'scheme_version[^\d]+(\d+)' -r '$1'
1234

相关:{{3}}

答案 5 :(得分:1)

你可以这样做:

$ echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | awk -F ':' '{print $4}' | tr -d '}'

答案 6 :(得分:0)

改善仅适用于获取“ scheme_version”的@potong答案,可以使用以下表达式:

$ echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | sed -n 's/.*"_id":["]*\([^(",})]*\)[",}].*/\1/p'
scheme_version

$ echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | sed -n 's/.*"_rev":["]*\([^(",})]*\)[",}].*/\1/p'
4-cad1842a7646b4497066e09c3788e724

$ echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | sed -n 's/.*"scheme_version":["]*\([^(",})]*\)[",}].*/\1/p'
1234