Как я могу рекурсивно заменить строку во всех файлах PHP в Linux?

2484
Peter Mortensen

У меня есть имя функции с ошибкой, и я хочу изменить его. Функция вызывается во многих местах проекта.

Как я могу сделать это с помощью команды Linux на SUSE ?

3

4 ответа на вопрос

4
John T

Вы можете использовать комбинацию find, xargsи sed:

find ./ -type f -name "*.php" | xargs sed -i 's/\<oldfunction\>/newfunction/g' 
осторожно! Поступая как / он / он / на мой комментарий сломал бы "там", и это было бы трудно исправить так просто! Сначала сделайте резервные копии, и помните, что sed использует регулярные выражения, так что у вас есть немного свободы в том, как вы пишете свои параметры. Phoshi 15 лет назад 0
ты прав, исправлен. John T 15 лет назад 0
Вы не обрезаете окружающие символы `<>`? ты не хочешь `s / \/ \/ г`? или я не распознаю элемент RE RE? quack quixote 15 лет назад 0
Да, это границы слов, я забыл добавить их, но Фоши напомнил мне. Без `\ <` (начало слова) и `\>` (конец слова) любое вхождение первой строки будет заменено в файле. Например, если его функция называется `len`, она также заменит` len` в `strlen`, и где-либо еще len будет найден в каждом файле, независимо от того, является ли это отдельным словом или частью прихода, что не является тем, что он хочет , Вы должны убедиться, что вы заменяете только полные слова, так как sed не знает слов без них. John T 15 лет назад 1
Я думал, что это может быть, но не смог найти быструю ссылку на sed-regex для проверки. Спасибо! quack quixote 15 лет назад 0
2
Doug Harris

Вариант с Perl :

find . -type f -name "*.php" -print0 | xargs -0 perl -pi.bak -e 's/oldfunction/newfunction/g' 

Преимуществом этого является то, что Perl создаст файлы резервных копий (с .bakрасширением), так что если вы все испортили, вы можете вернуться.

(Параметр -print0для поиска и -0параметр для xargs необходимы только в том случае, если у вас есть файлы или каталоги с пробелами в них.)

я думаю, что в версиях sed это тоже будет делать, если вместо `-i` вы используете` -i .bak` quack quixote 15 лет назад 0
ага, я просто RTFM и ~ шарлатан прав. Сед тоже сделает это. Doug Harris 15 лет назад 0
Я хотел бы видеть вариант Python (я пытаюсь изучить его) :) Pitto 12 лет назад 0
1
Nasir

Это то же самое, что и решение Джона Т:

find ./ -type f -name "*.php" -exec sed -i 's/\<oldfunction\>/newfunction/g' {} \; 

Я обычно не к xargs

РЕДАКТИРОВАТЬ: дороже .... по комментариям ниже.

есть одно отличие: он запускает отдельный экземпляр `sed` для каждого найденного файла; версия `xargs` запускает один экземпляр со многими аргументами. quack quixote 15 лет назад 0
да, больше разветвления участвуют. John T 15 лет назад 0
Если ваш find поддерживает это, используйте `+` вместо `\;`, и это уменьшит количество процессов sed, чтобы имитировать xargs. Doug Harris 15 лет назад 1
никогда не обращал на это внимание ... спасибо за разъяснения. Nasir 15 лет назад 0
0
CarlF

Дополнение к другим очень хорошим предложениям, уже опубликованным: сделайте резервную копию всего сайта (cp -r / var / www / var / wold) и сделайте там редактирование. Лично я бы переместил измененные файлы, например, в / var / www / changes и протестировал http: //www.sitename.tld/changed, чтобы убедиться, что все сценарии работают, прежде чем начать работу.

Похожие вопросы