使用Shell脚本从JSON String获取JSON值

时间:2017-08-18 13:24:34

标签: json regex shell pattern-matching

我有这个JSON字符串:

{"name":"http://someUrl/ws/someId","id":"someId"}

我只想获得“id”键的值并将其存储在某个变量中。我成功地尝试使用jq。但是由于一些限制,我需要通过使用grep和字符串匹配来实现这一点。

我到目前为止尝试了这个:grep -Po '"id":.*?[^\\]"';但是这会给"id":"ws-4c906698-03a2-49c3-8b3e-dea829c7fdbe"作为输出。我只需要id值。请帮忙

2 个答案:

答案 0 :(得分:1)

使用PCRE正则表达式,您可以使用外观。因此,您需要将"id":"放入positive lookbehind construct,然后匹配除"以外的1个或多个字符:

grep -Po '(?<="id":")[^"]+'

,其中

  • (?<="id":") - 要求"id":"立即显示在当前位置的左侧(但匹配的文字未添加到匹配值中)和
  • [^"]+ - 匹配并向匹配项添加除"以外的一个或多个字符。

获取带有转义引号的值:

grep -Po '(?<="id":")[^"\\]*(?:\\.[^"\\]*)*'

此处(?<="id":")仍然会匹配"id":"之后的位置,然后匹配以下内容:

  • [^"\\]* - 除"\以外的零个或多个字符
  • (?:\\.[^"\\]*)* - 零个或多个后续序列:
    • \\. - \和任何字符(任何转义序列)
    • [^"\\]* - 除"\以外的零个或多个字符

答案 1 :(得分:0)

参见Jshon,它是用于shell脚本使用的命令行Json解析器。

echo '{"name":"http://someUrl/ws/someId","id":"someId"}' | jshon -e id
"someId"

刚刚注意到我读过您说需要使用标准工具的部分,如果您的管理员不允许使用Jshon,系统很可能会有Python可用,您可以使用。< / p>

echo '{"name":"http://someUrl/ws/someId","id":"someId"}' | python -c 'import sys, json; print json.load(sys.stdin)["id"]'
someId

使用grep只是为了解决问题,我会避免它,并选择适当的Json解析器,如上所述。