我尝试使用实用程序jq更新数组内的数组中的值。我已经粘贴了下面的示例json。
更具体地说:在工作表数组中,然后在公式数组中,我想更改每个columnName的值为" MONTH"到了#34;年"。我想在sheetSleles数组中的sheet数组中做同样的事情,改变" MONTH"也是"年"
这个jq过滤器获取了columnNames的列表。
.sheets[1] | .formulas[] | .columnName
如何通过更新我想要的值来编辑整个文件?我是否使用if?
如果我想编辑一部分值,该怎么办?例如,在forumlaString属性中,只更改包含MONTH的字符串部分,但保留其余部分?
{
"version": "6.1.1",
"className": "xyz",
"sheets": [
{
"name": "Pass1",
"sheetId": "95e6c2cd-abbe-46c1-8012-bdf37438b9b7",
"keep": true,
"formulas": [
{
"columnName": "SAMPLE_PROVIDER",
"columnId": "0",
"columnIndex": 0,
"formulaString": "\u003dGROUPBY(#Raw!SAMPLE_PROVIDER)"
},
{
"columnName": "MONTH",
"columnId": "1",
"columnIndex": 1,
"formulaString": "\u003dGROUPBY(#Raw!MONTH)"
}
],
"columnStyles": [
{
"columnId": "0",
"name": "SAMPLE_PROVIDER",
"width": 206,
"thousandSeparator": true
},
{
"columnId": "1",
"name": "MONTH",
"width": 100,
"thousandSeparator": true
}
],
"nextColumnId": 2
},
{
"name": "Transform1",
"sheetId": "49071c1c-fa84-4ae3-92c1-b63175a6b26c",
"keep": true,
"formulas": [
{
"columnName": "SAMPLE_PROVIDER",
"columnId": "0",
"columnIndex": 0,
"formulaString": "\u003d#Pass1!SAMPLE_PROVIDER"
},
{
"columnName": "MONTH",
"columnId": "1",
"columnIndex": 1,
"formulaString": "\u003d#Pass1!MONTH"
}
],
"columnStyles": [
{
"columnId": "0",
"name": "SAMPLE_PROVIDER",
"width": 179,
"thousandSeparator": true
},
{
"columnId": "1",
"name": "MONTH",
"width": 100,
"thousandSeparator": true
}
],
"nextColumnId": 3
}
],
"advancedSchedulingInUse": true,
"errorHandlingMode": "IGNORE"
}
答案 0 :(得分:2)
看起来您更新的不仅仅是公式数组中的字段,还包括一些内容。
如果您想不加区别地将字符串"MONTH"
的所有匹配项更改为"YEAR"
,您可以这样做:
(.. | strings) |= sub("MONTH"; "YEAR")
答案 1 :(得分:1)
要更改所需容器中的columnName
字段,您可以使用
jq '(.sheets[] | .formulas[]? | .columnName | select(.=="MONTH")) |= "YEAR"' tmp.json
(如果没有密钥?
,formula
可以避免错误。)
要在公式字符串中将MONTH
替换为YEAR
,请将每个formulaString
值替换为sub
返回的可能修改后的字符串。
jq '(.sheets[] | .formulas[]? | .formulaString) |= sub("MONTH"; "YEAR")' tmp.json
(sub
需要jq
1.5,使用Oniguruma库进行编译。)
将这些组合成一个jq
过滤器?我不肯定;我对其中任何一个单独行动的原因只有一种微妙的理解。
答案 2 :(得分:0)
这可能是步行/ 1的任务。
(如果您的jq没有walk / 1,那么您可以从https://github.com/stedolan/jq/blob/master/src/builtin.jq复制其定义
例如,如果要在“MONTH”作为对象中某个键的值出现时将“MONTH”更改为“YEAR”,则以下内容将完成此任务:
jq 'walk(if type == "object"
then with_entries(.value |= (if . == "MONTH" then "YEAR" else . end))
else . end)' input.json
等价:
jq 'walk(if type == "object"
then with_entries(if .value == "MONTH" then .value = "YEAR" else . end)
else . end)' input.json
这些可以根据类似要求轻松修改。