我正在处理一个json文档,其中属性键是文件名,而值是那些文件的预期内容,其中文件主要是Java属性文件。
我正在编写一个Bash脚本,该脚本生成一个经过修改的json,其中的更改是json属性之一的内容的单个“行”中的文本。这实际上是在更改嵌入式Java属性文件中单个属性的值。
如果有关系,则json文档是kubernetes的configmap,但这与我遇到的问题无关。
过程本质上是这样的:
augfile=$(cat $outfile | sed -e "s/${property}[ ]*=.*$/${property}=${newValue}/")
kubectl get configmap $configmap -o json | jq ".data[\"$filename\"] = \"$augfile\"" | kubectl replace $configmap -f -
我在输出中看到的是:
+ kubectlidp dev2 get configmap onemapms-green-configs -o json
+ jq '.data["application.properties"] = "...
...
listprop =\
abc=def,\
ghi=jkl,\
mno=pqr
..."'
+ kubectl replace <configmapname> -f -
jq: error: Invalid escape at line 2, column 1 (while parsing '"\
"') at <top-level>, line 129:
listprop =\
很明显,我必须修改指定“ $ augfile”值的方式,但是我对那里的引号感到迷惑。
答案 0 :(得分:6)
尽管有时可以使用shell字符串插值法来“构建” jq程序,但是使用jq命令行选项--arg和/或--argjson传递shell值几乎总是更好的方法,例如在您的情况下(假设您的外壳允许这种形式的引用):
jq --arg filename "$filename" --arg augfile "$augfile" '
.data[$filename] = $augfile'