PHP Exec()使用sed给出了奇怪的结果

时间:2012-02-02 14:14:52

标签: php sed

我有一个完整文件路径列表。所有完整文件路径看起来都像“/ dir1 / dir2 / dir3 / s ..”。我想完全删除s。从文件名。文件名可能是复数,例如s.asdfs.cpp。我不想删除s的第二次出现。因为这是实际文件名的一部分,而不是列表中每个完整文件路径中的重新创建主题。

在shell中运行以下代码可以按照我的要求运行:

echo /dir1/dir2/dir3/s.filenames.cpp | sed 's#\(.*\)\/s\.\([^\/]*\)#\1\/\2#g'

给出了所需的结果:

/dir1/dir2/dir3/filenames.cpp

但如果我在php中运行以下内容:

$formatted_filename = exec("echo ".$filename." | sed 's#\(.*\)\/s\.\([^\/]*\)#\1\/\2#g'");

其中

$filename = /dir1/dir2/dir3/s.filenames.cpp;

然后在我的bash shell中运行

php -q script_name_that_contains_command_above.php > test.html

并刷新我显示test.html的firefox浏览器我得到了非常奇怪的结果。应该列出这个编辑过的文件路径的位置,我得到了

<strange box>/<strange box> 

其中

<strange box> 

是一个包含2行和2列的小方框,除了右下方的单元格外,由0组成。第一次出现在右下角的单元格中有一个,第二次出现在右下角的单元格中有一个。

sed命令有效,但是php或者exec命令正在解释它我不相信。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

使用exec与此特定正则表达式的解决方案是使用php函数preg_replace()

preg_replace("/\/s/./", "/", $filename);