我有以下字符串:
{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}
我需要获得“scheme version”的值,在这个例子中是1234。
我试过了
grep -Eo "\"scheme_version\":(\w*)"
然而它返回
"scheme_version":1234
我该怎么做?我知道我可以添加 sed 调用,但我更愿意使用单个grep。
答案 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 grep
中BSD version但ripgrep
中未提供的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