首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JQ选择后JQ编辑文件就位

使用JQ选择后JQ编辑文件就位
EN

Stack Overflow用户
提问于 2018-02-20 04:45:02
回答 1查看 4.7K关注 0票数 5

要在sed中使用JQ之类的-i编辑json文件,我发现了许多解决方案,如

jq ... input.json > tmp.json && mv tmp.json input.json

这是可行的,但我需要过滤我的文件,添加一些数据,并将其放回原来的位置。(即)更新文件中的特定对象)

我的文件包含了1000多个具有不同Element.的对象。我总是在Element上使用过滤器,我因疑问而缩短了。我有一个样本文件original.json ..。

代码语言:javascript
复制
{
  "Element": "acton",
  "objectName": "contacts",
  "Path": "/contacts",
  "Scenario": "",
  "serviceLevel": "",
  "IBM": "",
  "Gap": "",
  "clientPhase": "",
  "parentPhase": "",
  "existsToday": ""
}
{
  "Element": "acton",
  "objectName": "optouts",
  "Path": "/optouts",
  "Scenario": "",
  "serviceLevel": "",
  "IBM": "",
  "Dependency": "",
  "Gap": "",
  "clientPhase": "",
  "parentPhase": "",
  "existsToday": ""
}
{
  "Element": "acton",
  "objectName": "subscriptionTypes",
  "Path": "/subscription-types",
  "Scenario": "",
  "serviceLevel": "",
  "IBM": "",
  "Dependency": "",
  "Gap": "",
  "clientPhase": "",
  "parentPhase": "",
  "existsToday": ""
}

我想通过objectNamecontacts过滤,将一些数据添加到空IBM字段并保存到文件中。

应用相同的逻辑在包含"Y"的对象上将IBM字段编辑到"objectName": "contacts"

jq 'select(.objectName == "contacts") | .IBM = "Y"' original.json > tmpjson.json && mv tmpjson.json original.json

现在我的文件original.json显示

代码语言:javascript
复制
{
  "Element": "acton",
  "objectName": "contacts",
  "Path": "/contacts",
  "Scenario": "",
  "serviceLevel": "",
  "IBM": "Y",
  "Dependency": "",
  "Gap": "",
  "clientPhase": "",
  "parentPhase": "",
  "existsToday": ""
}

预期结果

代码语言:javascript
复制
{
  "Element": "acton",
  "objectName": "contacts",
  "Path": "/contacts",
  "Scenario": "",
  "serviceLevel": "",
  "IBM": "Y",
  "Gap": "",
  "clientPhase": "",
  "parentPhase": "",
  "existsToday": ""
}
{
  "Element": "acton",
  "objectName": "optouts",
  "Path": "/optouts",
  "Scenario": "",
  "serviceLevel": "",
  "IBM": "",
  "Dependency": "",
  "Gap": "",
  "clientPhase": "",
  "parentPhase": "",
  "existsToday": ""
}
{
  "Element": "acton",
  "objectName": "subscriptionTypes",
  "Path": "/subscription-types",
  "Scenario": "",
  "serviceLevel": "",
  "IBM": "",
  "Dependency": "",
  "Gap": "",
  "clientPhase": "",
  "parentPhase": "",
  "existsToday": ""
}

似乎在使用select之后,我不能再使用提供的解决方案https://github.com/stedolan/jq/wiki/FAQ#general-questions

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-20 04:52:06

您的jq过滤器不是您需要的,因为select选择。也就是说,它过滤掉不符合选择标准的对象。

这个jq过滤器应该做您想做的事情:

代码语言:javascript
复制
if (.objectName == "contacts") then .IBM = "Y" else . end

至于覆盖文件,许多访问sponge ( CLI实用程序的多用集合的一部分)的人都使用它。

代码语言:javascript
复制
jq 'if (.objectName == "contacts") then .IBM = "Y" else . end' input.json |
  sponge input.json
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48878003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档