json - 带有 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,有人可以帮忙吗?
解决方案
这有点棘手,因为替换字符串有很多行。您可以尝试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
推荐阅读
- ajax - iron-ajax 请求导致 spring boot 出现 cors 问题
- angular - Angular 5 路由器在谷歌登录回调中无法正常工作
- java - Selenium WebDriver - 单击“保存”按钮后应用程序变得无响应
- tensorflow - 对张量流的动态 rnn 版本中序列长度的混淆
- c++ - StackString 的 Chromium stack_container 不能工作(至少在 VisualC++ 中)
- java - 自动调整默认形状
- laravel - Laravel:JWT 令牌已过期
- mysql - 连接 MySQL 数据库时出错
- symfony - Symfony 3,缓存:清除错误连接超时
- python - python中的奇怪赋值