regex grep:组捕获

vom3gejh  于 2022-11-18  发布在  其他
关注(0)|答案(7)|浏览(194)

我有以下字符串:

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

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

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

但它返回

"scheme_version":1234

我知道我可以添加sedcall,但是我更喜欢使用单个grep。

332nm8kg

332nm8kg1#

您需要使用查看Assert,这样它就不会包含在匹配中:

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

0pizxfdo2#

这可能对您有用:

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
sg3maiej

sg3maiej3#

我建议您使用jq。jq是一个命令行JSON处理器。

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

$ cat tmp | jq .scheme_version
1234
m4pnthwp

m4pnthwp4#

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

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

在匹配scheme_version":后重新开始匹配过程,这比正向lookbehind有更好的性能。在regexp101上比较这两种方法表明,重置匹配开始方法需要37步和1毫秒,而正向lookbehind方法需要194步和21毫秒。
您可以自己在regex101上比较性能,也可以在PCRE文档中阅读有关重置匹配起点的更多信息。

csga3l58

csga3l585#

为了避免使用grep的PCRE功能(在GNU grep中可用,但在BSD version中不可用),另一种方法是使用ripgrep,例如

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

-r捕获组索引(例如$5)和名称(例如$foo)。
另一个例子是Python和json.tool module,它们可以进行验证和漂亮的打印:

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

相关:Can grep output only specified groupings that match?

mkshixfv

mkshixfv6#

您可以执行以下操作:

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

hsvhsicv7#

改进@potong的答案,它只对得到“scheme_version”有效,你可以使用下面的表达式:

$ 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

相关问题