Почему бы просто не сделать что-то вроде:
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
.