从Ruby脚本中的sed命令中转义PHP变量

时间:2011-12-21 18:56:46

标签: php ruby bash sed escaping

我有一个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');

任何想法都将不胜感激。 感谢。

1 个答案:

答案 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

请参阅http://net-ssh.rubyforge.org/sftp/v2/api/