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

在bash中使用jq在内容中用反斜杠替换json属性时引用问题,json,bash,kubernetes,jq,Json,Bash,Kubernetes,Jq,我正在处理一个json文档,其中属性键是文件名,值是这些文件的预期内容,其中文件大部分是Java属性文件 我正在编写一个Bash脚本,生成一个修改后的json,其中的更改是一个json属性的内容的单行中的文本。这实质上是更改嵌入式Java属性文件中单个属性的值 如果重要的话,json文档是一个kubernetes配置映射,但这与我遇到的问题无关 这个过程基本上是这样的: augfile=$(cat $outfile | sed -e "s/${property}[ ]*=.*$/${pr

我正在处理一个json文档,其中属性键是文件名,值是这些文件的预期内容,其中文件大部分是Java属性文件

我正在编写一个Bash脚本,生成一个修改后的json,其中的更改是一个json属性的内容的单行中的文本。这实质上是更改嵌入式Java属性文件中单个属性的值

如果重要的话,json文档是一个kubernetes配置映射,但这与我遇到的问题无关

这个过程基本上是这样的:

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值的方式,但我在那里的引号中迷失了方向。

虽然有时可以使用shell字符串插值来构造jq程序,但使用jq命令行选项-arg和/或-argjson传递shell值几乎总是更好的,例如,在您的情况下,假设您的shell允许这种报价方式:

 jq --arg filename "$filename" --arg augfile "$augfile" '
   .data[$filename] = $augfile'

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

 jq --arg filename "$filename" --arg augfile "$augfile" '
   .data[$filename] = $augfile'

在JSON中,换行符应该是\n而不是转义的换行符。我不知道这如何帮助我解决这个问题。根据指导原则,最好包含一些有代表性的JSON,即,足以证明这个问题。@Barmar确实提醒了我一个事实,那就是我必须弄清楚如何将$augfile中的值转换为json属性值中合法的格式,该格式将\转换为\\\n。也许这就是我所要做的。@DavidM.Karr,…对于一个独立的复制机,显示peak的答案,请参阅;如您所见,被替换的数据根本不需要包含任何文字引号或转义。在JSON中,换行符应该是\n而不是转义换行符。我不知道这如何帮助我解决这个问题。根据指导原则,最好包含一些有代表性的JSON,即,足以证明这个问题。@Barmar确实提醒了我一个事实,那就是我必须弄清楚如何将$augfile中的值转换为json属性值中合法的格式,该格式将\转换为\\\n。也许这就是我所要做的。@DavidM.Karr,…对于一个独立的复制机,显示peak的答案,请参阅;如您所见,被替换的数据根本不需要包含任何文字引号或转义。根据标记,他的shell是bash。为什么不允许这种引用方式?@CharlesDuffy问题不在于文字引号,而在于文字换行。但我认为这个答案可以处理任何特殊字符,因为它不做任何插值。@CharlesDuffy我不确定你想说什么。我的评论只是针对插入语假设你的外壳允许这种引用方式;我错过了这个背景。这是暴力协议。根据标签,他的外壳是bash。为什么不允许这种引用方式?@CharlesDuffy问题不在于文字引号,而在于文字换行。但我认为这个答案可以处理任何特殊字符,因为它不做任何插值。@CharlesDuffy我不确定你想说什么。我的评论只是针对插入语假设你的外壳允许这种引用方式;我错过了这个背景。这是暴力协议。