sed:未终止的's'命令 – 找不到需要转义的东西

我很新,使用sed的正则expression式,所以我有一些环境variables,我需要被放置到一个文件,如果find适当的“占位符”。

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

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

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

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

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

我有双重检查,我的占位符variables是确实存在和正确的这两个文件。 这只会发生在这两个替代品,我所有的其他替代品正​​常工作。 :/有什么东西需要逃脱?

谢谢!


按要求,configuration文件的一个片段,以便您可以看到如何显示占位符variables:

 umask = "027"; Include "conf.d/modules.cfg.lua" {$PROC_MODCONF} Include "conf.d/c2s-s2s.cfg.lua" 

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

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

sed命令是双引号的。 这样bash评估双引号string中的envvariables。 所以第二个$ PROC_MODCONF将会被bash环境中的值取代。

我们需要转义第一个文字{$ PROC_MODCONF},以便bash不会将其replace为环境中的值。

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

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

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

 sed -is/'{\$PROC_MODULES}'/"$PROC_MODULES"/g /etc/procdev/conf.d/modules.cfg.lua sed -is/'{\$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