[英]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.