У меня есть скрипт 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');
Любые идеи будут оценены.
Благодаря.