2012-02-02 35 views
0

我有一个完整的文件路径列表。所有完整的文件路径看起来像“/ dir1/dir2/dir3/s ..”。我想彻底删除s。从文件名。文件名有可能是复数,例如s.asdfs.cpp。我不想删除秒的第二次发生。因为这是实际文件名的一部分,而不是列表中每个完整文件路径中的重复主题。PHP执行()使用Sed给出奇怪的结果

跑在外壳的作品下面,我希望它:

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的除了右下角细胞的小盒子。第一次出现在右下角的单元格中有1,第二次出现在右下角的单元格中有2。

sed命令有效,但php或exec命令正在解释它我认为不正确。有任何想法吗?

+0

你为什么不使用PHP的正则表达式? – 2012-02-02 14:16:29

+0

我对PHP很新颖。你在暗示preg_match函数吗? – halexh 2012-02-02 14:21:31

+0

对于不可打印的字符,“奇怪的盒子”可能是“未知字符”字形字形。可能是null(ascii 0)。 – 2012-02-02 14:25:02

回答

0

使用Exec用这个特定的正则表达式的解决方案是使用PHP函数,preg_replace()

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