【问题标题】:Escape PHP variable in sed command from Ruby script从 Ruby 脚本中转义 sed 命令中的 PHP 变量
【发布时间】:2011-12-23 03:13:49
【问题描述】:

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

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

【问题讨论】:

  • 为什么要使用 sed?什么时候可以在 ruby​​ 中完全进行搜索和替换?
  • 该命令在 Ruby 中生成,有时在本地执行,但有时在 Ruby 无法操作文件的远程文件系统上通过 SSH 执行。看起来我只是忘记了一个反斜杠:command.gsub!(/(\$[a-zA-Z0-9_]+)/) { |s| s.gsub!(/\$/, '\\\$') } # Handle bash variable escaping 似乎工作。
  • @JaypalSingh 如果我在“$”前面没有转义字符,这似乎不起作用。 PHP 变量从 replace_with 字符串中删除。

标签: php ruby bash sed escaping


【解决方案1】:

更新:尝试在 sed 命令周围加上单引号,这样不会运行 bash 变量替换。我会像这样尝试红宝石的东西,直到它看起来恰到好处。

puts `echo #{command}` 

如果你仍然在使用 SSH,我会做一些这样的事情,以便能够通过 ssh 在本地运行它,通过将它全部保留为 ruby​​ 来实现完全控制变得非常容易。

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/

【讨论】:

  • 感谢您的回复。这绝对是另一种值得研究的方法。但是,我担心磁盘 IO/带宽。假设“文件”为 1mb。您的方法需要传输 2mb(那里 1,返回 1) - 对吗?而发送 sed one-liner 的资源密集程度要低得多。对于大量替换和大文件 - 我认为 sed 方式更有效。想法?
  • 您可以将这些东西同步到本地,然后进行替换,然后再将这些东西重新同步回来,这样可以最大限度地减少数据。请记住,在 ssh 的情况下 - 连接不仅是加密的,而且是压缩的,因此您不会使用完整的纯文本 2mb 传输,而是可能会使用大约 20%,具体取决于数据的重复性。
  • 啊,非常好。一定要考虑的事情。非常感谢。
  • 多思考一下您的问题是什么,并稍微更新了答案。如果觉得有用请点赞。 tnx.
猜你喜欢
  • 2017-01-24
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多