Bash 使用JQ提取路径数组,并用它自己的路径替换这些值

Bash 使用JQ提取路径数组,并用它自己的路径替换这些值,bash,path,jq,Bash,Path,Jq,Idk,如果JQ能够以一种简单的方式完成它,但是我想在转移到另一个工具之前询问这里的专家 我将收到一个包含需要提取的JSON路径的数组 这些选定的键及其值将生成一个属性文件,并在JSON本身中被替换 例如: 输入参数:“description”“assets.url” ^^^^我们可以将此输入格式更改为assets[].url,如果它更易于处理数组^^ JSON: 预期产出: 1) 属性文件(key=value) 2) 转换后的JSON文件 { "title": "TEST T

Idk,如果JQ能够以一种简单的方式完成它,但是我想在转移到另一个工具之前询问这里的专家

我将收到一个包含需要提取的JSON路径的数组

这些选定的键及其值将生成一个属性文件,并在JSON本身中被替换

例如:

输入参数:“description”“assets.url”
^^^^我们可以将此输入格式更改为assets[].url,如果它更易于处理数组^^

JSON:

预期产出:

1) 属性文件(key=value)

2) 转换后的JSON文件

 {
        "title": "TEST TITLE",
        "description": "${description}",
        "type": "Promo",
        "assets": [{
           "content_type": "image",
           "url": "${assets_0_url}"
           }, {
           "content_type": "image",
           "url": "${assets_1_url}"
        }]
    }
输出键(在本例中:description、assets\u 0\u url、assets\u 1\u url)不需要遵循此格式,但在数组中需要编号和唯一

唯一的要求是输出属性文件的键与输出JSON中替换的值匹配

财产:

说明=测试说明

JSON:

“说明”:“${description}

到目前为止我所做的:

FIELDS="description\|assets.*url"
OUTPUT=$(jq -r 'paths(scalars) as $p | "\($p|join("_"))=\(getpath($p))"' $FILE | grep $FIELDS)
printf "%s\r" "$OUTPUT" > json.properties
这为我提供了以下json.properties文件:

description=TEST DESCRIPTION
assets_0_url=https://www.fakesite.com/image.jpg
assets_1_url=https://www.fakesite.com/image2.jpg
JQ有可能吗


提前感谢

以下内容解决了大部分需求,但将“输入参数”的解析留作练习

属性文件 转换JSON
您在此处给出的特定属性文件格式是否有原因,或者是否可以使用一个JSON文件中的内容来填充另一个JSON文件?(虽然这两种方法都是可能的,但将包含
“url”:“${assets\u url}”
的输入文件改为包含
“url”:.assets[0].url
——也就是说,输入是jq源代码而不是JSON本身;那么您根本不需要中间属性格式)…或者是(3)示例输出,这意味着您希望将值映射回键?这也是可行的,但如果这是您想要的,那么问题可能应该进行编辑以使其清晰明了。嗨,我可以将输入更改为任何格式,无论更简单,我只需要将这些值提取到属性文件(我不需要遵循键名模式,但我需要确保数组编号且唯一),这些提取的JSON值需要由属性文件中相同的键名模式替换。Idk如果我能澄清lol,谢谢你,你能不能明确指出哪些代码样本是输入,哪些是输出,哪些特定组件可以更改,哪些不能更改?在某一点上,问题文本表示属性是输入的;但如果这是真的,那么输入可以更改为任何格式的语句和必须使用属性文件(而不是任何其他格式)的语句就会相互冲突。
FIELDS="description\|assets.*url"
OUTPUT=$(jq -r 'paths(scalars) as $p | "\($p|join("_"))=\(getpath($p))"' $FILE | grep $FIELDS)
printf "%s\r" "$OUTPUT" > json.properties
description=TEST DESCRIPTION
assets_0_url=https://www.fakesite.com/image.jpg
assets_1_url=https://www.fakesite.com/image2.jpg
def propertyValue(property):
  "\(property)=\(.[property])";

def propertyValue(arrayvaluedproperty; property):
  .[arrayvaluedproperty] as $a
  | range(0; $a|length) as $i
  | "\(arrayvaluedproperty)_\($i)_\(property)=\($a[$i][property])";

propertyValue("description"),
propertyValue("assets"; "url")

def updateProperty(p):
  .[p] = "${\(p)}";

def updateProperty(arrayvaluedproperty; p):
  .[arrayvaluedproperty] as $a
  | reduce range(0; $a|length) as $i (.;
    .[arrayvaluedproperty][$i] = "${\(arrayvaluedproperty)_\($i)_\(p)}");


updateProperty("description")
| updateProperty("assets"; "url")