从bash脚本变量为字符串解析json

从bash脚本变量为字符串解析json,bash,Bash,在bash中,我从mongo查询中得到一个json响应: ... json=`echo $con` echo $json 结果如下所示: { "_id" : "579289cc0", "externalId" : "2911", "externalTenantGUID" : "29d3928e53b", "name" :["X", "Y"] ... }{ "_id" : "5792892323", "externalId" : "291e31", "externalTenantGUID" :

在bash中,我从mongo查询中得到一个json响应:

...
json=`echo $con`
echo $json
结果如下所示:

{ "_id" : "579289cc0", "externalId" : "2911", "externalTenantGUID" : "29d3928e53b", "name" :["X", "Y"] ... }{ "_id" : "5792892323", "externalId" : "291e31", "externalTenantGUID" : "29d3928e3253b", "name" :["X", "Y"] ... }{ "_id" : "57923320", "externalId" : "293211", "externalTenantGUID" : "29d3928322e53b", "name" :["X", "Y"] ... }

在这里,我想解析这个$con响应,只获取映射到“_id”的值,比如579289cc0、5792892323、57923320。我尝试过使用sed和awk,但没有成功(对于manny条件),有没有更简单的方法不安装python

做那样的事

   <?php

$con = '{  "products":[
                        {
                            "_id": "579289cc0",
                            "externalId": "2911",
                            "externalTenantGUID": "29d3928e53b"
                        }, {
                            "_id": "5792892323",
                            "externalId": "291e31",
                            "externalTenantGUID": "29d3928e3253b"
                        }, {
                            "_id": "57923320",
                            "externalId": "293211",
                            "externalTenantGUID": "29d3928322e53b"
                        }
                    ]
        }';
echo $con;
$JSON_OBG = json_decode($con, true);

// print_r($JSON_OBG);

$Results = '';
foreach($JSON_OBG['products'] as $OBG)
{
 $Results .=  $OBG['_id'].',';
}
$Results = rtrim($Results,',');
echo  $Results ;
?>

使用
perl
regEx语法,可以按如下方式完成。尽管这是一种实现用例的黑客方法,但建议使用
jq
修复损坏的
json
字符串并提取这些标识符。现在你可以

perl -lne 'print "$1" if /.*\"_id\" : \"([[:alnum:]]+)\".*/' file
579289cc0
5792892323
57923320
此外,您还可以在启用PCRE的情况下使用
grep
,即使用
-p
标志进行Perl风格的正则表达式匹配

grep -Po "\"_id\" :\K \"([[:alnum:]]+)\"" <<<"$json"
"579289cc0"
"5792892323"
"57923320"
grep-Po“\”\u id\:\K\”([[:alnum:]+)\”与jq:

$ jq '._id' infile
"579289cc0"
"5792892323"
"57923320"
或者,如果您不想在结果周围加引号,请使用
-r
作为“原始输出”:

如果JSON数据位于变量中而不是文件中,则可以使用:


$jq-r.\u id'你能得到
jq
?我能得到jq吗?请看。@down\u投票人:为什么投票?我明确指出这不是一个正确的逻辑,建议使用
jq
?它显示了以下错误:./getnt.sh:line 18:unexpected token附近的语法错误
('./getnt.sh:line 18:
$JSON\u OBG=JSON\u decode($con,true)'无论如何,没有产品密钥,您必须了解如何创建一个JSON对象来处理,,,,,很好,它正在工作,但不幸的是,它只返回上一个JSON中的_id值,可能是因为文件中的JSON在一行上。我们如何为映射到“_id”的所有值设置此值?@CatalinaGenan:是的,是的。我假设内容与你的问题一样在新行中。我提到这是一个mongo查询调用。完成了,你能粘贴一个url并解释一下吗?我会尝试解决它。@CatalinaGenan:参考我下面的更新。你可以直接使用我提到的
$json
变量。
$ jq -r '._id' infile
579289cc0
5792892323
57923320
$ jq -r '._id' <<< "$json"
579289cc0
5792892323
57923320