我有以下字符串:
{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}
并且我需要得到“scheme version”的值,在这个例子中是1234。我试过了
grep -Eo "\"scheme_version\":(\w*)"
但它返回
"scheme_version":1234
我知道我可以添加sedcall,但是我更喜欢使用单个grep。
332nm8kg1#
您需要使用查看Assert,这样它就不会包含在匹配中:
grep -Po '(?<=scheme_version":)[0-9]+'
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
sg3maiej3#
我建议您使用jq。jq是一个命令行JSON处理器。
$ cat tmp {"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234} $ cat tmp | jq .scheme_version 1234
m4pnthwp4#
作为SiegeX建议的正lookbehind方法的替代方法,您可以使用\K转义序列将匹配起始点直接重置为scheme_version":之后。例如:
\K
scheme_version":
$ grep -Po 'scheme_version":\K[0-9]+'
在匹配scheme_version":后重新开始匹配过程,这比正向lookbehind有更好的性能。在regexp101上比较这两种方法表明,重置匹配开始方法需要37步和1毫秒,而正向lookbehind方法需要194步和21毫秒。您可以自己在regex101上比较性能,也可以在PCRE文档中阅读有关重置匹配起点的更多信息。
csga3l585#
为了避免使用grep的PCRE功能(在GNU grep中可用,但在BSD version中不可用),另一种方法是使用ripgrep,例如
grep
ripgrep
$ rg -o 'scheme_version.?:(\d+)' -r '$1' <file.json 1234
-r捕获组索引(例如$5)和名称(例如$foo)。另一个例子是Python和json.tool module,它们可以进行验证和漂亮的打印:
-r
$5
$foo
json.tool
$ python -mjson.tool file.json | rg -o 'scheme_version[^\d]+(\d+)' -r '$1' 1234
相关:Can grep output only specified groupings that match?
mkshixfv6#
您可以执行以下操作:
$ echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | awk -F ':' '{print $4}' | tr -d '}'
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
7条答案
按热度按时间332nm8kg1#
您需要使用查看Assert,这样它就不会包含在匹配中:
0pizxfdo2#
这可能对您有用:
抱歉,它不是grep,因此如果您愿意,可以忽略此解决方案。
或者继续使用grep并添加:
sg3maiej3#
我建议您使用jq。jq是一个命令行JSON处理器。
m4pnthwp4#
作为SiegeX建议的正lookbehind方法的替代方法,您可以使用
\K
转义序列将匹配起始点直接重置为scheme_version":
之后。例如:在匹配
scheme_version":
后重新开始匹配过程,这比正向lookbehind有更好的性能。在regexp101上比较这两种方法表明,重置匹配开始方法需要37步和1毫秒,而正向lookbehind方法需要194步和21毫秒。您可以自己在regex101上比较性能,也可以在PCRE文档中阅读有关重置匹配起点的更多信息。
csga3l585#
为了避免使用
grep
的PCRE功能(在GNUgrep
中可用,但在BSD version中不可用),另一种方法是使用ripgrep
,例如-r
捕获组索引(例如$5
)和名称(例如$foo
)。另一个例子是Python和
json.tool
module,它们可以进行验证和漂亮的打印:相关:Can grep output only specified groupings that match?
mkshixfv6#
您可以执行以下操作:
hsvhsicv7#
改进@potong的答案,它只对得到“scheme_version”有效,你可以使用下面的表达式: