我正在使用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"
}
}
}
用例是我有许多要以通用方式合并到json配置文件的键/值对(例如,env vars)。
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
随意选择许多其他备选方案和变体:-)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句