regex - sed:未终止的 `s' 命令 - 无法弄清楚需要转义的内容

标签 regex bash docker sed quoting

我对使用 sed 的正则表达式还很陌生,所以如果找到合适的“占位符”,我需要将一些环境变量放入文件中。

root@devproc-01:~# printenv
PROC_MODCONF=Include "conf.d/modconf.cfg.lua"
PROC_MODULES="lastlog"; "firewall"; "message_logging";

这是我定义的两个环境变量,下面是我的 sed 命令,它们是 Docker Compose 入口点文件的一部分。

sed -i s/'{$PROC_MODULES}'/$PROC_MODULES/g /etc/procdev/conf.d/modules.cfg.lua
sed -i s/'{$PROC_MODCONF}'/$PROC_MODCONF/g /etc/procdev/proc.cfg.lua

但是当这个脚本执行时,我得到了标题中看到的错误:

sed: -e expression #1, char 27: unterminated `s' command

我已经仔细检查了我的占位符变量是否确实存在并且在这两个文件中是正确的。这只发生在这两个替代品上,我所有的其他替代品都可以正常工作。 :/是否需要转义?

谢谢!


根据要求,其中一个配置文件的片段,以便您可以看到占位符变量是如何显示的:

umask = "027";

Include "conf.d/modules.cfg.lua"

{$PROC_MODCONF}

Include "conf.d/c2s-s2s.cfg.lua"

最佳答案

sed 命令和环境变量内容都需要转义。

sed -i "s/{\\\$PROC_MODCONF}/$PROC_MODCONF/g" /etc/procdev/conf.d/modules.cfg.lua

sed 命令在双引号中。这样 bash 会评估双引号字符串中的环境变量。所以第二个 $PROC_MODCONF 将被 bash 环境中的值替换。

我们需要对第一个文字 {$PROC_MODCONF} 进行转义,这样 bash 就不会用环境中的值替换它。

由于 $PROC_MODCONF 的值将逐字放入 sed 命令中,因此也需要对其进行转义。

$ export PROC_MODCONF="Include\\ \"conf.d\/modconf.cfg.lua\""
$ echo $PROC_MODCONF
Include\ "conf.d\/modconf.cfg.lua"

关于regex - sed:未终止的 `s' 命令 - 无法弄清楚需要转义的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46392139/

相关文章:

php - Preg_match 与西里尔字母不起作用

php - 为什么 PHP 挂起,当 bash 调用 fork 时

docker - Kubernetes/Spring Cloud Dataflow 流 > spring.cloud.stream.bindings.output.destination 被生产者忽略

javascript - 将子字符串替换为段落内的 html 元素,而不会使用 Jquery 弄乱事件

regex - 正则表达式替换

c - 使用 -D 引用宏预处理器

linux - rm 向变量添加额外的反斜杠

tomcat - 如何编写 Dockerfile 来启动网络服务器并根据某些要求 curl 它

docker - Redis桌面管理器无法在docker中连接redis?

javascript - 正则表达式/Javascript 帮助 - 搜索 URL 术语解析