在configuration文件中,我试图用PREFIX=/foobarreplacePREFIX=/jenkins 。
在(bash)命令行上,这工作正常:
sed -i.bak s/PREFIX=\\/jenkins/PREFIX=\\/foobar/g /etc/default/jenkins
但是,在Puppet脚本(.pp文件)中:
exec { 'Change-prefix': command => "sed -i.bak s/PREFIX=\\/jenkins/PREFIX=\\/foobar/g /etc/default/jenkins", path => ["/bin"], }
生产:
err: /Stage[main]//Exec[Change-prefix]/returns: change from notrun to 0 failed: sed -i.bak s/PREFIX=\/jenkins/PREFIX=\/foobar/g /etc/default/jenkins returned 1 instead of one of [0]
如何正确地逃避sed命令? 或者是其他事情?
我也用\\\/尝试,但是这样产生: warning: Unrecognised escape sequence '\/'
如果您的sedexpression式包含“/”,您可能需要考虑使用不同的分隔符。 在这个例子中,我select了pipe道符号。
sed -i.bak 's|PREFIX=/jenkins|PREFIX=/foobar|g' /etc/default/jenkins
在我看来,在你的Puppet清单中使用这个语法会更清晰和更具可读性。
从sed信息页面:
\%REGEXP%' (The%'可能被任何其他单个字符replace。)This also matches the regular expression REGEXP, but allows one to use a different delimiter than `/'. This is particularly useful if the REGEXP itself contains a lot of slashes, since it avoids the tedious escaping of every `/'. If REGEXP itself includes any delimiter characters, each must be escaped by a backslash (`\').
在许多版本的sed中,你可以使用不同的字符作为分隔符以避免出现/例如, 要么 #
sed -i.bak 's#PREFIX=/jenkins#PREFIX=/foobar#g' /etc/default/jenkins
哇,挂了! 在木偶清单中的Sed有点疯狂。 您应该使用puppetlabs stdlib中的file_line资源。
(你应该安装整个模块,但这里是自定义资源types) https://github.com/puppetlabs/puppetlabs-stdlib/blob/master/lib/puppet/type/file_line.rb
例:
file_line { 'sudo_rule': path => '/etc/sudoers', line => '%sudo ALL=(ALL) ALL', }
变成\\\\/作品。
例如:
exec { 'Change-prefix': command => "sed -i.bak s/PREFIX=\\\\/jenkins/PREFIX=\\\\/foorbar/g /etc/default/jenkins", path => ["/bin"], }
编辑 :…但肯尼和伊恩build议,当然使用不同的分隔符,是一个更清洁的解决scheme!