我有一个Ruby脚本,它生成一个sed命令来替换一些PHP代码。该命令稍后通过SSH执行。
command = "sed -i \"s*#{find_what}*#{replace_with}*\" #{file} "
replace_with字符串将包含多行PHP代码,因此需要进行以下转义:
command.gsub!(/\n/, '\\\n ') # Handle new-line escaping
command.gsub!(/&/, '\\\&') # Handle RegEx variable escaping
command.gsub!(/(\$[a-zA-Z0-9_]+)/) { |s| s.gsub!(/\$/, '\\$') } # Handle bash variable escaping
转义后的命令如下所示:
sed -i "s*require_once('file.php');*\n require_once(\$www_dir . \$path . '/file.php');\n *" /var/www/something.php
手动执行此命令时,一切都按预期工作。但是,如果我通过Kernel.system
执行命令,则所有PHP变量都会在替换字符串中被删除。 Something.php看起来像这样:
require_once( . . '/file.php');
任何想法都将不胜感激。 感谢。
答案 0 :(得分:2)
更新:尝试在sed命令周围使用单引号,这样就不会运行bash变量替换。我会像这样尝试红宝石,直到它看起来恰到好处。
puts `echo #{command}`
如果你正在使用SSH,我只是做这样的东西,以便能够通过ssh在本地运行,通过保持全部红宝石,使得完全控制变得非常容易。
require 'net/sftp'
Net::SFTP.start('host', 'username', :password => 'password') do |sftp|
filedata = sftp.file.open("/path/to/remote", "r").read
filedata.gsub!(/foo/, "bar")
sftp.file.open("/path/to/remote", "w") do |f|
f.puts filedata
end
end