Правильный синтаксис Perl для сложной замены - PullRequest
0 голосов
/ 28 сентября 2010

У меня есть большое количество PHP-файлов и строк, которые необходимо изменить из стандартного echo "string goes here"; синтаксис для: custom_echo("string goes here");

Это строка, которую я пытаюсь ввести в Perl для достижения этой цели: perl -pi -e 's/echo \Q(.?*)\E;/custom_echo($1);/g' test.php К сожалению, я делаю небольшую синтаксическую ошибку, и это не меняет "test.php" в последнюю очередь. Может кто-нибудь сказать мне, как это исправить?

Ответы [ 2 ]

4 голосов
/ 28 сентября 2010

Почему бы просто не сделать что-то вроде:

perl -pi -e 's|echo (\".*?\");|custom_echo($1);|g' file.php

Я не думаю, что \Q и \E делают то, что вы думаете, они делают. Они не начало и не конец цитат. Они на случай, если вы введете специальный символ регулярного выражения (например, .) - если вы окружите его \Q ... \E, то специальный символ регулярного выражения не будет интерпретироваться.

Другими словами, ваше регулярное выражение пытается найти соответствие буквальной строке (.?*), которой у вас, вероятно, нет, и поэтому подстановки не выполняются.

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

Редактировать: Я также настоятельно рекомендую сделать:

perl -pi.bak -e ... file.php

Это создаст «резервный» файл, в который будет скопирован исходный файл. В моем примере выше, он создаст файл с именем file.php.bak, который содержит исходное содержимое перед заменой. Это невероятно полезно во время тестирования, пока вы не уверены, что правильно построили свое регулярное выражение. Черт, диск дешевый, я бы посоветовал всегда использовать оператор командной строки -pi.bak.

2 голосов
/ 28 сентября 2010

Вы помещаете свои круглые скобки внутри выражения мета-цитирования (\Q(pattern)\E) вместо внешнего ((\Qpattern\E)), поэтому ваши скобки также экранируются, а регулярное выражение ничего не захватывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...