我有一个返回变量的json,我试图只从json中获取值。我只限于grep,sed和awk
RESULTS='{ "results" : [ { "repo" : "appdeploy", "path" : "org/test/cxp/python/1.0-SNAPSHOT", "name" : "python-1.0-20170519.130808-42.jar" } ], "range" : { "start_pos" : 0, "end_pos" : 1, "total" : 1 } }'
echo $RESULTS | grep -o '"path" : "(.*)",'
返回结果
"path" : "org/test/cxp/python/1.0-SNAPSHOT",
老实说,我唯一想要的部分是
org/test/cxp/python/1.0-SNAPSHOT
答案 0 :(得分:1)
使用jq
,您可以使用'.results[0] | .path'
过滤器。您可以使用this tool online here。
但是,如果您无法访问jq
,则可以使用基于PCRE的grep
命令,例如
grep -oP '(?<="path" : ")[^"]+'
-P
选项启用PCRE正则表达式语法用法,您可以使用lookarounds仅检查模式匹配,但不将匹配的文本包含在返回的匹配值中。
模式详情
(?<="path" : ")
- 与位置相匹配的正面后视,前面带有"path" : "
substring [^"]+
- 匹配且消耗的否定括号表达式(添加到匹配值)除"
以外的1个或多个字符。请参阅online grep
demo:
RESULTS='{ "results" : [ { "repo" : "appdeploy", "path" : "org/test/cxp/python/1.0-SNAPSHOT", "name" : "python-1.0-20170519.130808-42.jar" } ], "range" : { "start_pos" : 0, "end_pos" : 1, "total" : 1 } }'
echo $RESULTS | grep -oP '(?<="path" : ")[^"]+'
打印org/test/cxp/python/1.0-SNAPSHOT
。
答案 1 :(得分:0)
在这里,使用grep和sed:
echo $RESULTS | grep -op '"path" :\s"[^"]*"' | sed 's/"//g' | sed 's/path : //g'
这首先通过echo $RESULTS | grep -op '"path" :\s"[^"]*"'
生成"path" : "org/test/cxp/python/1.0-SNAPSHOT"
,然后第一次调用sed 's/"//g'
删除双引号,第二次调用sed 's/path : //g'
删除path :
}
答案 2 :(得分:0)
最好为这些类型的东西使用JSON解析器。
Python,Ruby,Perl都提供了强大的JSON解析器。
这是Python中的一个例子:
$ python -c '
import json
import fileinput
print json.loads("".join(line for line in fileinput.input()))["results"][0]["path"]
' <<<$(echo "$RESULTS")
org/test/cxp/python/1.0-SNAPSHOT