У меня есть список полных путей к файлу. Все полные пути файлов выглядят как «/ 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 интерпретируют ее неправильно, я верю. Есть идеи?
почему бы вам не использовать регулярные выражения в PHP? –
Я довольно новичок в PHP. Вы предлагаете функцию preg_match? – halexh
Этот «странный ящик», вероятно, является символом шрифта «неизвестного персонажа», для непечатаемых символов. Вероятно, нуль (ascii 0). –