双引号在 PHP 的 shell_exec 和 sed 中不断被解析

  • 本文关键字:sed exec PHP shell php bash sed
  • 更新时间 :
  • 英文 :


我花了几个小时试图解决这个问题。我正在使用shell_exec(是的,我知道与此相关的安全问题)和SED更改文件中的文本。

问题是不管我尝试什么,我似乎都无法输出文字,引号仍然完好无损。我已经尝试了几乎所有可以逃脱的单句和双引号的组合,但它没有奏效。经过数小时的尝试,我决定在这里提出问题。

代码在PHP文件中:

shell_exec('sed -i "s/patterntoreplace/yolo(word,"Hello Everyone", word)/" test.txt

问题是文件最终以:

yolo(word,Hello Everyone, word)

报价不断解析,我绝对需要它们。我尝试了使用escapeshellargescapeshellcmd并尝试各种单引号和双引号组合,例如将其放入变量,但我仍然无法使其工作。

这对我来说非常令人沮丧,因为这是我项目的最后一部分,它应该很简单,但是没有报价,我无法运行程序。这很令人发指。

有人可以告诉我该命令中要替换的内容以获取正确输出的报价吗?

这应该有效:

$arg = 's/patterntoreplace/yolo(word,"Hello Everyone", word)/';
$cmd = 'sed -i '.escapeshellarg($arg).' test.txt';
shell_exec($cmd);

这可以并且应该使用PHP完成,无需sed

$filename = 'test.txt';
$pattern = 'patterntoreplace';
$replace = 'yolo(word,"Hello Everyone", word)';
$lines = []; 
foreach(file($filename) as $line) {
    $lines []= preg_replace($pattern, $replace, $line);
}
file_put_contents($filename, join("", $lines));

您可以使用斜杠再次使用内部的引号,但是只要牢记内部引号

// have added slashes to Hello Everyone
shell_exec('sed -i "s/patterntoreplace/yolo(word,"Hello Everyone", word)" test.txt')

您是否尝试过使用'而不是'"而不是",而不是在其中不被解析它们?他们已经说了!:)

相关内容

  • 没有找到相关文章

最新更新