【发布时间】: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