Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Ruby脚本中转义sed命令中的PHP变量_Php_Ruby_Bash_Sed_Escaping - Fatal编程技术网

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

从Ruby脚本中转义sed命令中的PHP变量,php,ruby,bash,sed,escaping,Php,Ruby,Bash,Sed,Escaping,我有一个Ruby脚本,它生成一个sed命令来替换一些PHP代码。该命令稍后通过SSH执行 command=“sed-i\”s*{find#u what}*{replace#u with}*\“{file}” 替换为字符串将包含多行PHP代码,因此需要进行以下转义: command.gsub!(/\n/, '\\\n ') # Handle new-line escaping command.gsub!(/&/, '\\\&') # Handle RegEx variabl

我有一个Ruby脚本,它生成一个sed命令来替换一些PHP代码。该命令稍后通过SSH执行

command=“sed-i\”s*{find#u what}*{replace#u with}*\“{file}”

替换为字符串将包含多行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\u once('file.php');*\n require\u once(\$www\u dir.\$path.'/file.php');\n*“/var/www/something.php

手动执行此命令时,一切正常。但是,如果我通过
Kernel.system
执行该命令,则替换字符串中的所有PHP变量都会被删除。Something.php的最终结果如下:

require_once(..'/file.php')

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

更新:尝试在sed命令周围使用单引号,这样就不会运行bash变量替换。我会像这样尝试一下ruby的东西,直到它看起来合适为止

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

请参见

为什么要向sed施舍?什么时候可以在ruby中完全执行搜索和替换?该命令在ruby中生成,有时在本地执行,但有时在ruby无法操作文件的远程文件系统上通过SSH执行。看起来我忘记了一个反斜杠:
command.gsub!(/(\$[a-zA-Z0-9\\]+)/{s\\$/,'\\$')}句柄bash变量转义
似乎可以工作。如果
$www\u dir
是您的变量,那么就不用
\$www\u dir
只需执行
$www\u dir
,因为您正在使用
围绕您的
sed
脚本运行。@如果在“$”前面没有转义字符,JaypalSingh似乎不起作用。PHP变量从替换为字符串中剥离出来。感谢您的回复。这绝对是另一个值得研究的方法。但是,我担心磁盘IO/bandwith。假设“文件”是1mb。您的方法需要传输2mb(1个在那里,1个在后面)-正确吗?而发送sed一艘班轮的资源密集度要低得多。对于大量替换和大型文件,我认为sed方法更有效。想法?你可以先将数据同步到本地,然后进行替换,然后再将数据同步回来,这样可以最大限度地减少数据量。请记住,在ssh的情况下,连接不仅是加密的,而且是压缩的,因此您将不会使用完整的明文2mb传输,而是根据数据的重复性,使用大约20%的传输。啊,非常好的一点。一定要好好想想。非常感谢。请仔细考虑一下你的问题,并更新一下答案。如果你觉得有用,请投票。tnx。