如何在Puppet脚本的sed命令中转义“/”?

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