Массовая вставка кода перед тегом ‹/body› в 100 файлах

я хотел бы вставить

<?php include_once('google_analytics.php'); ?>

перед закрывающим тегом body около 100 файлов php. К сожалению, человек, который сделал сайт, не сделал шаблон шапки или футера.

Как лучше всего это сделать? Я пытался использовать grep/find для получения списка файлов и передачи результатов через xargs в sed, но мне не повезло. У меня, вероятно, неправильное регулярное выражение. Может ли кто-нибудь помочь мне с этим?

Кроме того, есть ли какие-либо графические инструменты для Apple OS X, которые вы могли бы порекомендовать?

Спасибо, Майк

изменить

find . -print0 -name "*.php" | xargs -0 perl -i.bak -pe 's/<\/body>/<?php include_once("google_analytics.php"); ?>\n<\/body>/g'

работает.


person getWeberForStackExchange    schedule 14.11.2009    source источник
comment
Поскольку вы делаете это: как только вы придумаете решение, вы можете вместо этого включить include_once(footer.php) и header.php, чтобы вам было легче вносить такие изменения в будущем!   -  person poundifdef    schedule 14.11.2009
comment
Рашер: Отличное предложение.   -  person John    schedule 14.11.2009
comment
вы, ребята, Mac... зачем вам графический инструмент для решения проблемы замены текста?   -  person nickf    schedule 14.11.2009
comment
Я не знаю, Рашер. Я думаю, что это может ввести в заблуждение и не помещать весь остальной общий код нижнего колонтитула в footer.php. На самом деле это тоже не заканчивается, я, вероятно, также должен сделать header.php. Никф, хорошее замечание. Что с этим не так? grep -lz ‹/тело› * | xargs -0 perl -i.bak -pe 's/\‹\/body\›/‹?php include(google_analytics.php); ?›\n‹\/тело›/g'   -  person getWeberForStackExchange    schedule 14.11.2009
comment
mswebersd: Каков эффект этого оператора grep?   -  person John    schedule 14.11.2009
comment
На самом деле, это обратная косая черта после первого тела в r.e. необходимо?   -  person John    schedule 14.11.2009
comment
Возьмите любые документы в папке, у которых есть тег body (у некоторых нет), и после этого перечислите имена файлов с нулевым символом, чтобы сделать список совместимым с xargs... Я думаю. Я надеялся, что он будет делать то же самое, что и find print0.   -  person getWeberForStackExchange    schedule 14.11.2009
comment
Я так думаю, потому что я хотел бы сопоставить закрывающий тег body. Вы имеете в виду обратную косую черту перед словом body, верно? Или вы имеете в виду обратную косую черту перед знаком меньше?   -  person getWeberForStackExchange    schedule 14.11.2009
comment
mswebersd: Вы видите, о какой обратной косой черте я спрашиваю? ... -pe 's/\‹\/body\› ... последний в этом фрагменте   -  person John    schedule 14.11.2009
comment
Похоже, вы избегаете этого знака больше, не так ли?   -  person John    schedule 14.11.2009
comment
О, после извините, почему-то прочитал раньше. Да наверное и не надо.   -  person getWeberForStackExchange    schedule 14.11.2009
comment
Да, вы правы - знак больше.   -  person getWeberForStackExchange    schedule 14.11.2009
comment
Я думаю, что я хотел спросить раньше, что вы на самом деле видите, когда выполняете эту команду? Каков эффект от этого заявления? Может указать вам, где что-то идет не так.   -  person John    schedule 14.11.2009
comment
найти . -print0 -имя *.php | xargs -0 perl -i.bak -pe 's/‹\/body›/‹?php include_once(google_analytics.php); ?›\n‹\/body›/g’ работает.   -  person getWeberForStackExchange    schedule 14.11.2009


Ответы (8)


Использование СЭД:

 sed -i s/'<\/body>'/"<?php include_once('google_analytics.php'); ?>\n<\/body>"/ *.htm

Опция -i редактирует файл на месте. Если вы скажете -iBAK, то он создаст резервную копию файла перед его редактированием.

person poundifdef    schedule 14.11.2009
comment
Итак, вся эта ерунда с perl была ненужной. Хорошо знать. :) - person getWeberForStackExchange; 14.11.2009

Если вас интересуют инструменты с графическим интерфейсом, загрузите TextMate. Поместите все 100 файлов в папку и откройте эту папку с помощью ТМ. Это переведет TM в режим проекта, и вы увидите все файлы на боковой панели. Теперь выполните Edit>Find>Find In Project, поместите </body> в поле «найти», <?php include_once('google_analytics.php'); ?></body> в поле «заменить», нажмите «Заменить» и дайте ему запуститься.

person Ben    schedule 14.11.2009

для этого требуется сценарий редактирования

#!/bin/sh
for i in *.html; do
ed $i << \eof
?</body>?s/^/<?php include_once('google_analytics.php'); ?>&/
w
q
eof
done

Он запускает одну из первых (буквально) программ, когда-либо написанных для Unix, текстовый редактор ed(1) Кена Томпсона. в каждом файле и вносит необходимые изменения. Если вы хотите, чтобы он работал с определенными файлами, а не с каждым .html в каталоге, просто измените *.html на "$@".

Прочитав ссылку в Википедии только что, я узнал кое-что интересное. Кен Томпсон впервые применил регулярные выражения, по-видимому, они были просто математическими выражениями, пока он не написал ed(1).

person DigitalRoss    schedule 14.11.2009
comment
Милая, сейчас ухожу, но я попробую, когда вернусь. Спасибо. - person getWeberForStackExchange; 14.11.2009
comment
ха-ха, re: ваше редактирование: посмотрите мое блестящее описание вопроса: stackoverflow.com/questions/1085404/what-is-regular-expression/ - person poundifdef; 14.11.2009

Вам нужно предоставить массив с именами файлов в $files, чтобы следующее решение работало:

foreach ($files as $file)
{
    $txt = file_get_contents($file);

    $txt = str_replace('</body>', '<?php include_once(\'google_analytics.php\'); ?>'."\n".'</body>', $txt);

    file_put_contents($file, $txt);
}
person Franz    schedule 14.11.2009
comment
Еще один умный способ сделать это. Спасибо. Я мог бы просто вставить directory_iterator и все готово. - person getWeberForStackExchange; 14.11.2009

Dreamweaver выполнит поиск/замену для всего локального сайта; Я уверен, что другие HTML-редакторы тоже.

person jay    schedule 14.11.2009
comment
Спасибо... Dreamweaver слишком дорог для меня. - person getWeberForStackExchange; 14.11.2009

Некоторые IDE, такие как dreamweaver, предоставляют функции для поиска и замены во многих файлах, целых папках и т. д. Вы можете использовать одну из них и выполнить поиск и замену, заменив тег close body нужным кодом.

person Vincent Ramdhanie    schedule 14.11.2009

Я не разработчик PHP, но является ли PHP допустимым форматом XML? Не похоже, но откуда мне знать. Даже если это успех этого ответа, он может больше зависеть от того, являются ли файлы, с которыми вы работаете, действительными PHP. Но... если это так, было бы довольно просто использовать преобразование XML (xslt) для сопоставления тега body, скопировать его содержимое и добавить новый тег после сопоставленного содержимого.

person Ryan Lynch    schedule 14.11.2009
comment
Я не уверен, как синтаксические анализаторы XML будут обрабатывать теги ‹?php. НО я на 100% уверен, что сам HTML не пройдет через синтаксический анализатор XML. Однако хорошее предложение. - person getWeberForStackExchange; 14.11.2009
comment
Да, я так и думал. Хотя стоит попробовать. - person Ryan Lynch; 14.11.2009

Как насчет замены на

</body>

с участием

<?php include_once('google_analytics.php'); ?></body>

?

person John    schedule 14.11.2009
comment
Может быть, то, что он хочет сделать, и то, что он на самом деле сделал, — две разные вещи? - person John; 14.11.2009