У меня проблема с моим php-скриптом, когда я звоню shell_exec
и передать регулярное выражение.
Код PHP:
shell_exec("sh myscript.sh 'FOO\s*ONE'");
myscript.sh:
result=$(grep -c "${1}" myLongFile.txt)
echo ${result}
Как это, он возвращается 0
но если иль позвонить напрямую с cmd grep -c "FOO\s*ONE" myLongFile.txt
это возвращается 23
,
И если я заменю в своем PHP-скрипте \s
по классу [[:space:]]
это работает, но я должен использовать \s
Я пробовал много решений, но не смог.
Вы должны избежать \
персонаж с другим \
так получается:
shell_exec("sh myscript.sh 'FOO\\s*ONE'");
Вы должны избежать обратной косой черты:
shell_exec("sh myscript.sh 'FOO\\s*ONE'");
Спасибо вам всем,
Я нахожу решение, я просто добавляю опцию -P для grep в моем скрипте так:
result=$(grep -P -c "${1}" myLongFile.txt)
Теперь я могу использовать \ s
-P, —perl-regexp
Интерпретировать PATTERN как регулярное выражение Perl.
Проблема не в том, чтобы убежать, а просто потому, что grep
основан на POSIX; Вот почему вы должны использовать [[:space:]]
вместо \s
, Некоторые версии grep
Поддержка синтаксиса PCRE с использованием -P
вариант, но использование POSIX является более переносимым.
Также, если вы хотите передать переменную из PHP в скрипт оболочки, желательно использовать escapeshellarg()
:
$re = 'FOO[[:space:]]*ONE';
shell_exec(sprintf("sh myscript.sh %s", escapeshellarg($re)));
Следует отметить, что escapeshellarg()
не работает согласованно между Windows и Linux (и даже между оболочками); в некоторых случаях вам нужно подать заявку addcslashes()
,