在配置文件中,我试图替换PREFIX=/jenkins
为PREFIX=/foobar
.
在(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 '\/'
如果您的 sed 表达式包含“/”,您可能需要考虑使用不同的分隔符。我在这个例子中选择了管道符号。
sed -i.bak 's|PREFIX=/jenkins|PREFIX=/foobar|g' /etc/default/jenkins
在我看来,在您的 Puppet 清单中使用此语法会更清晰、更易读。
从 sed 信息页面:
在许多版本的 sed 上,您可以使用不同的字符作为分隔符以避免必须转义/例如,使用 | 很常见。或者 #
哇,哇……等一下!Puppet 清单中的 Sed 有点疯狂。您应该使用 puppetlabs stdlib 中的 file_line 资源。
(你应该安装整个模块,但这里是自定义资源类型) https://github.com/puppetlabs/puppetlabs-stdlib/blob/master/lib/puppet/type/file_line.rb
例子:
结果证明
\\\\/
有效。例如:
编辑:...但是当然,正如肯尼和伊恩所建议的那样,使用不同的定界符是一种更简洁的解决方案!