sed未端接's';带有jqjson字符串的命令
我有一个命令(在Docker容器中运行),在这个命令中,我试图用jq生成的JSON字符串替换表达式 小背景: 我有一个文件sed未端接's';带有jqjson字符串的命令,json,shell,sed,jq,edit,Json,Shell,Sed,Jq,Edit,我有一个命令(在Docker容器中运行),在这个命令中,我试图用jq生成的JSON字符串替换表达式 小背景: 我有一个文件tmp.txt中的环境变量白名单: ENV_VAR_A ENV_VAR_B ENV_VAR_C 我使用jq,使用前面线程中的答案生成JSON字符串,如下所示: jq -Rn '[inputs | {(.): env[.]}] | add' ./tmp.txt # GENERATES { "ENV_VAR_A": "a val", "ENV_VAR_B": "a val",
tmp.txt
中的环境变量白名单:
ENV_VAR_A
ENV_VAR_B
ENV_VAR_C
我使用jq,使用前面线程中的答案生成JSON字符串,如下所示:
jq -Rn '[inputs | {(.): env[.]}] | add' ./tmp.txt
# GENERATES { "ENV_VAR_A": "a val", "ENV_VAR_B": "a val", "ENV_VAR_C": "a val"}
太棒了!现在我尝试使用sed(作为DockerCMD
)来替换某些东西:
# CMD sed -i 's@{{SOME_PATTERN}}@'$( jq -Rn '[inputs | {(.): env[.]}] | add' ./etc/nginx/conf.d/env)'@' ./somefile
但我得到了:
sed: -e expression #1, char 22: unterminated `s' command
因此,在替换过程中出现了一些问题——但我在shell中的知识还不足以解决这个问题,我觉得我必须移动一些引号/分隔符,或者在替换之前将我的jq管道到某个地方以“清理”json字符串,但我不确定是什么
寻找一些sed-fu,有人能帮忙吗?这有点棘手,因为替换字符串有很多行。您可以使用流程替换尝试此
sed
:
sed -i -e '/{{SOME_PATTERN}}/r '<( jq -Rn '[inputs | {(.): env[.]}] | add' /etc/nginx/conf.d/env) -e '//d' somefile
@亚当问:
那会是什么样子
如果jq有--rawfile选项,那么就不需要同时处理jq和sed:
< somefile jq -R --rawfile text tmp.txt '
($text
| split("\n")
| map(select(length>0)
| {(.): env[.]}) | add) as $json
| sub("{{SOME_PATTERN}}"; $json|tostring)'
0)
|{(.):env[.]})| add)作为$json
|sub({SOME_PATTERN}});$json|tostring)
我不知道替换字符串有很多行,我认为它是“扁平的”-我可以用jq
缩小JSON输出以使sed更简单吗?同一个命令,我试图通过管道将jq命令的输出传输到“| jq-c”,但我认为我甚至缺少了一些东西,即jq-nRc'[inputs{(.):env[.]]| add'tmp.txt
将与我建议的sed
命令配合使用。请尝试一下并告诉我。-nRc
有效!我不想我的替换字符串有很多行,现在我可以明白为什么sed被阻塞了。非常感谢你!与其努力让sed与jq一起工作,为什么不使用jq来完成所有工作?如果你能举例说明一下somefile
可能是什么样子,也许会有所帮助。@peak这是一个HTML文件,我正在用JSON字符串替换占位符。如果你的jq支持--rawfile命令行选项,那么使用jq来执行这两项任务就很容易了。@peak这看起来像什么?
< somefile jq -R --rawfile text tmp.txt '
($text
| split("\n")
| map(select(length>0)
| {(.): env[.]}) | add) as $json
| sub("{{SOME_PATTERN}}"; $json|tostring)'