如何使用jq将文件合并为json,其中文件名是属性选择器,文件内容是值?

我正在使用jq进行一些json操作。场景是我有一个json文件和许多其他包含json或字符串的文件,我想将它们合并为一个输出。

main.json 包含:

{
  "property1": "someValue","sub": {
     "property2": "property2"
   }
}

.property1 (这是文件名)包含:

newValue

.sub.property2 (这是文件名)包含:

newProperty2

.other (这是文件名)包含:

{
  "complex": {
    "cprop": "cpropvalue"
  }
}

我想将这些文件合并在一起,使用文件名作为jq选择器,并使用文件的内容作为值。输出为:

{
  "property1": "newValue","sub": {
     "property2": "newProperty2"
   },"other": {
      "complex": {
        "cprop": "cpropvalue"
      }
   }
}

用例是我有很多键/值对(例如,env vars),我想以通用方式合并到json配置文件中。

jq工具非常强大,但是我很难弄清楚该怎么做。如果最后一种情况(文件的内容是json)是不可能的,则前两种仍然非常有用。根据其他搜索,我认为所有部分都存在(文件名,输入等),但是我正在弄清楚如何组合它们。

t456456 回答:如何使用jq将文件合并为json,其中文件名是属性选择器,文件内容是值?

这是解决紧密相关问题的解决方案,该问题假定所有文件都包含有效的JSON:

jq '
  def props: 
    split(".") | map(select(length>0));

  reduce inputs as $json (.;
    setpath(input_filename | props; $json) )
' main.json .other .property1 .sub.property2 

点文件可以以任何顺序列出(例如,用.???*列出),但必须在main.json之后指定。

这里的主要细微之处是,在.之后出现的第一个reduce将由main.json的内容填充。

要使用上述方法解决上述问题,需要将名为.property1和.sub.property2的文件中的原始文本转换为有效的JSON。这可以在预处理步骤中完成,例如如下:

jq -R .property1 | sponge .property1
jq -R .sub.property2 | sponge .sub.property2

随时选择许多其他替代方案和变体:-)

本文链接:https://www.f2er.com/3141445.html

大家都在问