2013-11-08 3 views
0

У меня есть список около 500 папок. Внутри каждой из этих папок находится файл functions.php.Массовое редактирование файлов через командную строку?

мне нужно искать каждый functions.php файл для следующего текста:

function wp_initialize_the_theme_finish() 

Мне нужно заменить любую строку, которая имеет вышеуказанный текст с этим:

function wp_initialize_the_theme_finish() { $uri = strtolower($_SERVER["REQUEST_URI"]); if(is_admin() || substr_count($uri, "wp-admin") > 0 || substr_count($uri, "wp-login") > 0) { /* */ } else { $l = 'mydomain.com'; $f = dirname(__file__) . "/footer.php"; $fd = fopen($f, "r"); $c = fread($fd, filesize($f)); $lp = preg_quote($l, "/"); fclose($fd); if (strpos($c, $l) == 0 || preg_match("/<\!--(.*" . $lp . ".*)-->/si", $c) || preg_match("/<\?php([^\?]+[^>]+" . $lp . ".*)\?>/si", $c)) { wp_initialize_the_theme_message(); die; } } } wp_initialize_the_theme_finish(); 

ПРИМЕЧАНИЕ: Мне нужно заменить вся строка с моей новой строкой, а не только начало.

Любая помощь была бы принята с благодарностью.

+0

СЭД будет в состоянии сделать это для вас, используйте '-i' (in-place) flag – Drakosha

+0

Я действительно смог сделать это в одном файле. Я предполагаю, что часть, которую я не понимаю, - это поиск всех файлов functions.php во всех папках и замена всего сразу ... – user2410854

+0

Я ответил, как вы находите все файлы – Drakosha

ответ

0

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

find . -name "*/function.php" -print | xargs sed -i 's/foo/bar/g' 

Где Foo является:

function wp_initialize_the_theme_finish().+\n 

и бар:

function wp_initialize_the_theme_finish() { $uri = strtolower($_SERVER["REQUEST_URI"]); if(is_admin() || substr_count($uri, "wp-admin") > 0 || substr_count($uri, "wp-login") > 0) { /* */ } else { $l = 'mydomain.com'; $f = dirname(__file__) . "/footer.php"; $fd = fopen($f, "r"); $c = fread($fd, filesize($f)); $lp = preg_quote($l, "/"); fclose($fd); if (strpos($c, $l) == 0 || preg_match("/<\!--(.*" . $lp . ".*)-->/si", $c) || preg_match("/<\?php([^\?]+[^>]+" . $lp . ".*)\?>/si", $c)) { wp_initialize_the_theme_message(); die; } } } wp_initialize_the_theme_finish(); 

Используйте following rules, чтобы экранировать специальные символы в Foo и бар: В двух словах , для sed:

  1. Напишите регулярное выражение между одинарными кавычками.
  2. Используйте '\' 'для поиска одной кавычки.
  3. Положите обратную косую черту перед $. */[]^И только те символы.
+0

Я продолжаю получать эту ошибку при попытке : 'sed: -e выражение # 1, char 239: неизвестный параметр' s'' – user2410854

+0

Просто попробовал это и получил эту ошибку: 'sed: -e выражение # 1, char 239: неизвестный параметр s' – user2410854

+0

' \ Q 'и' \ E' поддерживается в 'perl' не в' sed' – jkshah

0

Используйте find команду, для поиска всех соответствующих файлов, а затем использовать sed -i обновить файлы

0

Поскольку строки поиска и замены достаточно длинные, сначала сохраните их в переменных.

Тогда попробуйте использовать find вместе с sed используя -exec вариант

#!/bin/bash 

search='^.*function wp_initialize_the_theme_finish().*$' 
replace='function wp_initialize_the_theme_finish() { $uri = strtolower($_SERVER["REQUEST_URI"]); if(is_admin() || substr_count($uri, "wp-admin") > 0 || substr_count($uri, "wp-login") > 0) { /* */ } else { $l = "mydomain.com"; $f = dirname(__file__) . "/footer.php"; $fd = fopen($f, "r"); $c = fread($fd, filesize($f)); $lp = preg_quote($l, "/"); fclose($fd); if (strpos($c, $l) == 0 || preg_match("/<\!--(.*" . $lp . ".*)-->/si", $c) || preg_match("/<\?php([^\?]+[^>]+" . $lp . ".*)\?>/si", $c)) { wp_initialize_the_theme_message(); die; } } } wp_initialize_the_theme_finish();' 

find -type f -name 'function.php' -exec sed -i "s/${search}/${replace}/g" {} \; 

Другая альтернатива использования xargs

find -type f -name 'function.php' -print0 | xargs -0 sed -i "s/${search}/${replace}/g" 
Смежные вопросы