繁体   English   中英

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

[英]Replacing key value pair with spaces using 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,期望QQSTRING_TEXT或QQSTRING_INTERP_START或QQSTRING_END(Unix shell引用问题?)在第1行:.parameters | = map(如果.name ==“ git_host_fqdn”,则.default =“ something jq :错误:可能在第1行的'if'语句未终止:.parameters | = map(如果.name ==“ git_host_fqdn”,那么.default =“ something jq:2编译错误

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

最好将$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM