使用JQ添加新对象后更新文件

时间:2018-07-16 13:43:47

标签: shell jq

我是jq库的新手,这里我正在阅读json的HotelInfo字段:

./jq-linux64 '.HotelInfo' 74687.json

{
  "HotelURL": "http://www.tripadvisor.com/aaa.html",
  "HotelID": "74687",
  "Price": "$156"
}

现在,我要向该数组添加{city: tehran}对象:

./jq-linux64 --arg city tehran '.HotelInfo +{city: $city}' 74687.json 

{
  "HotelURL": "http://www.tripadvisor.com/aaa.html",
  "HotelID": "74687",
  "Price": "$156",
  "city": "tehran"
}

它已经完成了,但是这也没有反映在文件上,并且文件仍然没有用这个新记录更新,我该如何更新json文件呢?

3 个答案:

答案 0 :(得分:0)

您需要将结果写入一个临时文件,并将其重命名为原始文件:

./jq-linux64 --arg city tehran '.HotelInfo +{city: $city}' 74687.json > temp.json
mv temp.json 74687.json

答案 1 :(得分:0)

您可以使用sponge或写入一个临时文件,然后对其进行“ MV”操作。

有关更多详细信息和替代方法,请参见jq FAQ中的以下问:

:如何完成JSON文件的“就地”编辑? jq等同于sed -i?

答案 2 :(得分:0)

如果您想保留原始的json结构并仅附加新值,则可以使用:

$ jq '.HotelInfo.city = "tehran"' 74687.json > 74687.jso.tmp
$ mv 74687.json.tmp 74687.json

这将使用以前的所有字段/对象更新文件:

{
  "HotelInfo": {
    "HotelURL": "http://www.tripadvisor.com/aaa.html",
    "HotelID": "74687",
    "Price": "$156",
    "city": "tehran"
  }
}

如果您只是想创建一个新结构,请删除.HotelInfo内的其他可能的键

$ jq --arg city tehran '.HotelInfo +{city: $city}' 74687.json > 74687.jso.tmp 
$ mv 74687.json.tmp 74687.json

这将仅使用Hotelinfo对象内容创建文件:

{
  "HotelURL": "http://www.tripadvisor.com/aaa.html",
  "HotelID": "74687",
  "Price": "$156",
  "city": "tehran"
}