sed:unterminated的's'命令 - 无法弄清楚需要被转义的内容

时间:2017-09-24 16:14:16

标签: 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"

2 个答案:

答案 0 :(得分:2)

sed命令和env var内容都需要转义。

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

sed命令是双引号。这样bash就会在双引号字符串中评估env变量。所以第二个$ 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"

答案 1 :(得分:1)

您需要引用替换扩展。你需要这样做,因为它们包含空格。 $也需要被转义,因为它是一个元字符。

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