引用在bash中使用jq用内容中的反斜杠替换json属性的问题

Dav*_*arr 1 bash json jq kubernetes

我正在使用一个json文档,其中属性键是文件名,而值是那些文件的预期内容,其中文件主要是Java属性文件。

我正在编写一个生成修改后的json的Bash脚本,其中的更改是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 -
Run Code Online (Sandbox Code Playgroud)

我在输出中看到的是:

+ 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    =\                     
Run Code Online (Sandbox Code Playgroud)

显然,我必须修改指定“ $ augfile”值的方式,但是我对那里的引号不知所措。

pea*_*eak 6

尽管有时可以使用shell字符串插值来“构造” jq程序,但是使用jq命令行选项--arg和/或--argjson传递shell值几乎总是更好的选择,例如,在您的情况下(假设您的shell允许这种形式的引用):

 jq --arg filename "$filename" --arg augfile "$augfile" '
   .data[$filename] = $augfile'
Run Code Online (Sandbox Code Playgroud)