我有一个属性文件和一个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播放,并且可以在其中运行,但不能在脚本上播放。
答案 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
。