Nano Hash - криптовалюты, майнинг, программирование

Команда оболочки php exec с соответствием регулярному выражению

Я создаю небольшой алгоритм для исправления всего исходного кода msgid, чтобы он работал нормально:

$ find . -name '*.php' | xargs perl -pi -e 's/\$t\(\047bad msgid\047\);/\$t\(\047good msg id\047\);/g'

Я хочу создать выполнение внутри foreach скрипта php, например:

$cmd = "find {$projectPath} -name '*.php' | xargs perl -pi -e 's/\$t\('\047'" . preg_quote($bad) . "\047\)/\$t\(\047" . preg_quote($good) . "\047\)/g'";
exec(escapeshellarg($cmd));

Это сумасшествие, я пробую все, escapeshellarg, смешиваю двойные кавычки с одинарными кавычками, кавычки с обратной косой чертой ... после 4 часов я могу сказать, черт возьми, это и shell exec cmd. пс. к черту тоже регулярный опыт

есть идеи запустить эту команду внутри метода exec?


Решение для поиска замены $t('msgid с ошибкой') на $t('правильный msgid') внутри всего проекта с использованием php, perl, exec (проверено на Mac)

+1 час и 2 оборота, спасибо за предложение @Marc B:

$cmd = "find {$projectPath} -name '*.php' | xargs perl -pi -e 's|\\\$t\(\\047" . str_replace("'", "\\047", preg_quote($bad)) . "\\047\)|\\\$t\(\\047" . str_replace("'", "\\047", preg_quote($good)) . "\\047\)|g'";
exec($cmd);
25.01.2014

Ответы:


1

Базовое понимание цитирования поможет...

\, которые у вас есть в определении строки $cmd, используются PHP.

escapeshallarg() имеет дело только с кавычками, поэтому ваши $t в xargs дословно передаются в оболочку, так что в конечном итоге вы делаете по существу эквивалент ввода следующего в приглашении оболочки:

$ find /project/path -name '*.php' | xargs .... 's/$t etc....'

$t будет расширен оболочкой, и, поскольку у вас нет $t, определенного в этой новой оболочке, ваши регулярные выражения превратятся в

's/('\047
   ^---hey, no $t value!

Пытаться

$cmd = "find {$projectPath} -name '*.php' | blah blah s/\\$t etc...
                                                        ^^--double escape

PHP использует одну обратную косую черту, оставляя в строке s/\$t. Когда это будет передано в оболочку, \$t будет передано в perl как $t и будет рассматриваться как переменная perl...

25.01.2014
  • когда я нажимаю double \\$t php, попробуйте взять $t как переменную, поэтому я нажимаю \\\$t, и он создает лучшую строку, но все равно не работает 25.01.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..