双引号继续在PHP的shell_exec和sed中解析

时间:2014-02-02 21:39:59

标签: 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并尝试单引号和双引号的各种组合,但我仍然无法使其工作。

这对我来说非常令人沮丧,因为这是我项目的最后一部分,它应该很简单,但我不能在没有引号的情况下运行我的程序。这真是令人生气。

有人可以告诉我在该命令中要替换什么来获得正确输出的报价吗?

3 个答案:

答案 0 :(得分:1)

这应该有效:

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

答案 1 :(得分:0)

您是否曾尝试使用\'代替'\"而不是",而您不打算对其进行解析?他们已经说过了! :)

答案 2 :(得分:0)

这可以而且应该用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));