首页 > 解决方案 > 带有 jq json 字符串的 sed 未终止的 `s' 命令

问题描述

背负这个问题,我有一个命令(在 Docker 容器中运行),我试图用 sed 用 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,有人可以帮忙吗?

标签: jsonshellsedjqedit

解决方案


这有点棘手,因为替换字符串有很多行。您可以尝试sed使用进程替换:

sed -i -e '/{{SOME_PATTERN}}/r '<( jq -Rn '[inputs | {(.): env[.]}] | add' /etc/nginx/conf.d/env) -e '//d' somefile

确保您正在使用bash.

jq使用产生单行输出的稍微修改的命令,您可以执行以下操作:

sed -i 's/{{SOME_PATTERN}}/'"$(jq -nRc '[inputs | {(.): env[.]}] | add' /etc/nginx/conf.d/env)"'/' somefile

推荐阅读