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