2012-02-02 2 views
0

У меня есть список полных путей к файлу. Все полные пути файлов выглядят как «/ dir1/dir2/dir3/s ..». Я хочу полностью удалить s. из имени файла. Существует возможность множественного имени файла, например s.asdfs.cpp. Я не хочу удалять второе появление s. так как это часть фактического имени файла, а не повторная тема в каждом полном пути к файлу в списке.PHP Exec() Использование 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; 

А потом в моей Баш оболочки перспективе

php -q script_name_that_contains_command_above.php > test.html 

и обновить свой браузер Firefox, который отображает test.html я получаю очень странные результаты. На месте, где этот отредактированный путь к файлу должен быть перечислен я

<strange box>/<strange box> 

где

<strange box> 

является небольшая коробка с 2-мя рядами и 2 колонками, состоящими из 0 'для нижней правой ячейки, за исключением. Первое появление имеет 1 в нижней правой ячейке, а второе имеет 2 в нижней правой ячейке.

Команда sed работает, но php или команда exec интерпретируют ее неправильно, я верю. Есть идеи?

+0

почему бы вам не использовать регулярные выражения в PHP? –

+0

Я довольно новичок в PHP. Вы предлагаете функцию preg_match? – halexh

+0

Этот «странный ящик», вероятно, является символом шрифта «неизвестного персонажа», для непечатаемых символов. Вероятно, нуль (ascii 0). –

ответ

0

Раствор для использования Exec с этим конкретным регулярным выражением, чтобы использовать функцию PHP, preg_replace()

preg_replace("/\/s/./", "/", $filename); 
Смежные вопросы