使用jq将键值对替换为空格

时间:2019-03-20 19:11:11

标签: json bash jq

我有一个属性文件和一个json文件。属性文件包含需要在json中替换的键值对。

当该值没有空格时,它将按预期工作,但是当该值具有空格时,不会替换该值。

替换值的脚本

#!bin/bash
echo hello

while read line;
do
#echo $line
key=$(echo "$line" |cut -d':' -f1)
#echo $part1
value=$(echo "$line" |cut -d':' -f2)
if [[ ! -z $value ]];
then
key="\"$key\""
value="\"$value\""
echo $key : $value
jq '.parameters |= map( if .name == '$key' then .default = '$value' else . end )' cam.json > cam1.json
mv cam1.json cam.json
fi
done < prop.properties

属性文件

git_con_type:something
git_host_fqdn:something again
git_user:something again again
git_user_password:something
git_repo:something
git_repo_user:
git_branch:

JSON文件

{
"name": "${p:Instance_Name}",
  "parameters": [
    {
      "name": "git_con_type",
      "default": "",
      "immutable_after_create": false
    },
    {
      "name": "git_host_fqdn",
      "default": "hello",
      "immutable_after_create": false
    },
    {
      "name": "git_user",
      "default": "",
      "immutable_after_create": false
    },
    {
      "name": "git_user_password",
      "default": "Passw0rd",
      "immutable_after_create": false
    },
    {
      "name": "git_repo",
      "default": "lm",
      "immutable_after_create": false
    },
    {
      "name": "git_repo_user",
      "default": "-Life",
      "immutable_after_create": false
    },
    {
      "name": "git_branch",
      "default": "master",
      "immutable_after_create": false
    },
    {
      "name": "git_clone_dir",
      "default": "/opt/git",
      "immutable_after_create": false
    }
  ]
}

错误

  

jq:错误:语法错误,意外的$ end,在第1行第1行出现QQSTRING_TEXT或QQSTRING_INTERP_START或QQSTRING_END(Unix shell引用问题?)。   .parameters | = map(如果.name ==“ git_host_fqdn”,则.default =“   jq:错误:可能在第1行的'if'语句未终止:   .parameters | = map(如果.name ==“ git_host_fqdn”,则.default =“   jq:2个编译错误

如何使jq接受带空格的值?我已经尝试过使用空格进行jqplay播放,并且可以在其中运行,但不能在脚本上播放。

1 个答案:

答案 0 :(得分:3)

最好将$ key和$ value传递到jq中,如以下脚本脚本(故意极简)所示:

#!/bin/bash

while read line
do
  key=$(echo "$line" |cut -d':' -f1)
  value=$(echo "$line" |cut -d':' -f2)
  if [[ ! -z "$value" ]]
  then
     jq --arg key "$key" --arg value "$value" '.parameters |= map( if .name == $key then .default = $value else . end )' cam.json > cam1.json
     mv cam1.json cam.json
fi
done < prop.properties

最好还是完全避免bash循环,而只需一次调用jq即可完成所有操作。

一站式解决方案

这个想法是创建一个键-值对的字典($ dict),可以使用内置过滤器INDEX/1轻松完成:

INDEX(inputs | split(":") | select(.[1] | length > 0); .[0])
| map_values(.[1]) as $dict
| $cam
| .parameters |= map( $dict[.name] as $value | if $value then .default = $value else . end )

调用

使用program.jq中的上述jq程序:

jq -n -R -f program.jq --argfile cam cam.json prop.properties > cam1.json && mv cam1.json cam.json

或使用sponge

jq -n -R -f program.jq --argfile cam cam.json prop.properties | sponge cam.json

请特别注意-n选项,这是必需的,因为program.jq使用inputs