两个映射的jq编译错误 - 不替换json值

时间:2017-11-20 01:50:12

标签: json jq

在shell脚本中使用两个jq映射时,我观察到以下数据的错误。

test.json

[
  {
     "ParameterKey": "<ans1>",
     "ParameterValue": "<ans2>"
  }
]

我的脚本是

cat test.json | \
jq 'map(if .ParameterKey == "<ans1>" then . + {"ParameterKey" : "input1" } else . end )' \
   'map(if .ParameterValue == "<ans2>" then . + {"ParameterValue" : "input2" } else . end)' \ 
> result.json

2 个答案:

答案 0 :(得分:0)

虽然未给出准确的错误,但运行命令会生成

jq: error: Could not open file map(if .ParameterValue == "<ans2>" 
then . + {"ParameterValue": "input2"} else . end): No such file or directory

No such file or directory消息表明jq正在尝试打开文件 名为“ map(if .ParameterValue == "<ans2>" then . + {"ParameterValue": "input2"} else . end) ”的名称正在发生,因为该字符串出现在jq需要输入文件名称的位置。

要纠正此问题,您可以将两个过滤字符串合并为一个|字符串,并将test.json作为输入文件传递,例如

jq '
   map(if .ParameterKey == "<ans1>" then . + {"ParameterKey": "input1"} else . end)
 | map(if .ParameterValue == "<ans2>" then . + {"ParameterValue": "input2"} else . end)
' test.json > result.json

或保留基本结构并添加第二个显式jq调用,例如

cat test.json | \
jq 'map(if .ParameterKey == "<ans1>" then . + {"ParameterKey": "input1"} else . end)' | \
jq 'map(if .ParameterValue == "<ans2>" then . + {"ParameterValue": "input2"} else . end)' \
> result.json

在这种特殊情况下,任何一种都可行,但第一种方式更有效。 <{3}}只使用一个map()更好。

答案 1 :(得分:0)

这是两个解决方案 - 一个既简单又简短,一个可以很好地扩展。请注意,在这两种情况下, <div class="general-input-wrapper inline-arrangement"> <label class="control-label">Type</label> <select id="diaryTypeCombobox" kendo-drop-down-list="diaryTypeCombobox" ng-model="vm.diaryType" ng-disabled="vm.addNoteOpenFrom == 'OpenCaseDragDrop' || vm.addNoteOpenFrom == 'Organizer'" k-on-change="vm.valueEffectsOnDiaryTypeChangedByUser()" k-options="vm.diaryTypeOptions" k-value-primitive="true" style="width: 100%;"></select> </div> 只需要一次。

简单而简洁

map

使用帮助函数

map( if .ParameterKey   == "<ans1>" then . + {"ParameterKey":   "input1"} else . end
   | if .ParameterValue == "<ans2>" then . + {"ParameterValue": "input2"} else . end)