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();

注意:我需要用我的新行替换整行,而不仅仅是开头。

任何帮助将不胜感激。

4

3 回答 3

0

上面有一篇很详细的文章。似乎与您的问题非常相关。本质上,命令是:

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();

使用以下规则转义 foo 和 bar 中的特殊字符: 简而言之,对于 sed:

  1. 在单引号之间写正则表达式。
  2. 使用 '\'' 搜索单引号。
  3. 在 $.*/[]^ 之前放一个反斜杠,并且只放那些字符。
于 2013-11-08T18:02:33.153 回答
0

使用find命令,搜索所有相关文件,然后使用sed -i更新文件

于 2013-11-08T17:58:55.650 回答
0

由于搜索和替换字符串相当长,首先将它们存储在变量中。

然后尝试与using选项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"
于 2013-11-08T18:30:16.723 回答