In a config file, I'm trying to replace PREFIX=/jenkins
with, say, PREFIX=/foobar
.
On the (bash) command line, this works fine:
sed -i.bak s/PREFIX=\\/jenkins/PREFIX=\\/foobar/g /etc/default/jenkins
However, in a Puppet script (.pp file):
exec { 'Change-prefix':
command => "sed -i.bak s/PREFIX=\\/jenkins/PREFIX=\\/foobar/g /etc/default/jenkins",
path => ["/bin"],
}
produces:
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]
How to escape the sed command properly? Or is something else the matter?
I also tried with \\\/
, but that yields: warning: Unrecognised escape sequence '\/'
In cases where your sed expression contains a '/', you may want to consider using a different delimiter. I chose the pipe symbol in this example.
sed -i.bak 's|PREFIX=/jenkins|PREFIX=/foobar|g' /etc/default/jenkins
Using this syntax in your Puppet manifest would be a lot cleaner and more readable, in my opinion.
From the sed info page:
On many versions of sed you can use a different character as a delimiter to avoid having to escape / e.g it's quite common to use | or #
Whoa, whoa... hang-on! Sed in a puppet manifest is a bit crazy. You should be using the file_line resource, from the puppetlabs stdlib.
(you should install the entire module, but here is the custom resource type) https://github.com/puppetlabs/puppetlabs-stdlib/blob/master/lib/puppet/type/file_line.rb
Example:
Turns out
\\\\/
works.For example:
Edit: ...but of course using a different delimiter, as Kenny and Iain suggested, is a lot cleaner solution!