Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sed未端接's';带有jqjson字符串的命令_Json_Shell_Sed_Jq_Edit - Fatal编程技术网

sed未端接's';带有jqjson字符串的命令

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",

我有一个命令(在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", "ENV_VAR_C": "a val"}
太棒了!现在我尝试使用sed(作为Docker
CMD
)来替换某些东西:

# 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)'