正则表达式模式匹配细化

时间:2017-05-19 14:14:26

标签: regex linux grep

我有一个返回变量的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

3 个答案:

答案 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