使用AWK在Wordpress SQL转储中安全地搜索和替换URL
我正在开发一个webtool,将Wordpress安装镜像到开发系统中 其目的是拥有一个用于生产的实时系统和一个用于测试的开发系统。然后,webtool提供了这些系统之间的一键同步。 每个系统都是独立的,有自己的webroot、数据库和url 我在数据库转储中遇到问题,我必须搜索对源的所有引用,并将它们替换为目标的URL(例如:“www.example.com”->“www-dev.example.com”) 我需要做的是:使用AWK在Wordpress SQL转储中安全地搜索和替换URL,wordpress,search,awk,replace,command-line,Wordpress,Search,Awk,Replace,Command Line,我正在开发一个webtool,将Wordpress安装镜像到开发系统中 其目的是拥有一个用于生产的实时系统和一个用于测试的开发系统。然后,webtool提供了这些系统之间的一键同步。 每个系统都是独立的,有自己的webroot、数据库和url 我在数据库转储中遇到问题,我必须搜索对源的所有引用,并将它们替换为目标的URL(例如:“www.example.com”->“www-dev.example.com”) 我需要做的是: 查找所有出现的URL,并将其替换为新URL 如果匹配项也与序列化字符串
sed-I.orig's/360\.example\.com/360 dev\.my\.example\.dev/g'
。
这不起作用,因为转储中包含序列化数组,其中包含url。sed
命令不适合更新序列化数组的字符串长度指示符
我最新的尝试是按照建议使用awk
,因为它能够进行算术运算
我的awk
脚本如下所示:
/360[.]example[.]com/ {
sub("360.example.com", "360-dev.my.example.dev");
if ($0 ~ /s:[[:digit:]]+:["](http[s]?:\/\/)?360[.]example[.]com["]/){
FS="\"";
$0=$0;
n=length($2)-1;
sub(/:[[:digit:]]+:/, ":" n ":");
}
} 1
我的脚本中似乎有一些错误,我找不到。它不会替换所有出现的url,并完全跳过长度指示器更新
我如何修改脚本以实现我想要做的事情
编辑:(添加输入/输出样本)
Databasedump由整个wordpress数据库组成,每个表和记录都有CREATE TABLE IF NOT EXISTS
和INSERT
语句
正常(未序列化)发生:
(36, 'home', 'http://360.example.com/blogname', 'yes'),
(404, 'wp-maintenance-mode', 'a:21:{s:6:"active";i:1;s:4:"time";i:0;s:4:"link";i:1;s:7:"support";i:0;s:10:"admin_link";i:1;s:7:"rewrite";s:0:"";s:6:"notice";i:1;s:4:"unit";i:1;s:5:"theme";i:0;s:8:"styleurl";s:69:"http://360.example.com/wp-content/themes/blogname/css/maintenance.css";s:5:"index";i:0;s:5:"title";s:0:"";s:6:"header";s:0:"";s:7:"heading";s:0:"";s:4:"text";s:12:"Example Text";s:7:"exclude";a:1:{i:0;s:0:"";}s:6:"bypass";i:0;s:4:"role";a:1:{i:0;s:13:"administrator";}s:13:"role_frontend";a:1:{i:0;s:13:"administrator";}s:5:"radio";i:0;s:4:"date";s:0:"";}', 'yes'),
应导致:
(36, 'home', 'http://360-dev.my.example.dev/blogname', 'yes'),
(404, 'wp-maintenance-mode', 'a:21:{s:6:"active";i:1;s:4:"time";i:0;s:4:"link";i:1;s:7:"support";i:0;s:10:"admin_link";i:1;s:7:"rewrite";s:0:"";s:6:"notice";i:1;s:4:"unit";i:1;s:5:"theme";i:0;s:8:"styleurl";s:76:"http://360-dev.my.example.dev/wp-content/themes/blogname/css/maintenance.css";s:5:"index";i:0;s:5:"title";s:0:"";s:6:"header";s:0:"";s:7:"heading";s:0:"";s:4:"text";s:12:"Example Text";s:7:"exclude";a:1:{i:0;s:0:"";}s:6:"bypass";i:0;s:4:"role";a:1:{i:0;s:13:"administrator";}s:13:"role_frontend";a:1:{i:0;s:13:"administrator";}s:5:"radio";i:0;s:4:"date";s:0:"";}', 'yes'),
序列化事件:
(36, 'home', 'http://360.example.com/blogname', 'yes'),
(404, 'wp-maintenance-mode', 'a:21:{s:6:"active";i:1;s:4:"time";i:0;s:4:"link";i:1;s:7:"support";i:0;s:10:"admin_link";i:1;s:7:"rewrite";s:0:"";s:6:"notice";i:1;s:4:"unit";i:1;s:5:"theme";i:0;s:8:"styleurl";s:69:"http://360.example.com/wp-content/themes/blogname/css/maintenance.css";s:5:"index";i:0;s:5:"title";s:0:"";s:6:"header";s:0:"";s:7:"heading";s:0:"";s:4:"text";s:12:"Example Text";s:7:"exclude";a:1:{i:0;s:0:"";}s:6:"bypass";i:0;s:4:"role";a:1:{i:0;s:13:"administrator";}s:13:"role_frontend";a:1:{i:0;s:13:"administrator";}s:5:"radio";i:0;s:4:"date";s:0:"";}', 'yes'),
应导致:
(36, 'home', 'http://360-dev.my.example.dev/blogname', 'yes'),
(404, 'wp-maintenance-mode', 'a:21:{s:6:"active";i:1;s:4:"time";i:0;s:4:"link";i:1;s:7:"support";i:0;s:10:"admin_link";i:1;s:7:"rewrite";s:0:"";s:6:"notice";i:1;s:4:"unit";i:1;s:5:"theme";i:0;s:8:"styleurl";s:76:"http://360-dev.my.example.dev/wp-content/themes/blogname/css/maintenance.css";s:5:"index";i:0;s:5:"title";s:0:"";s:6:"header";s:0:"";s:7:"heading";s:0:"";s:4:"text";s:12:"Example Text";s:7:"exclude";a:1:{i:0;s:0:"";}s:6:"bypass";i:0;s:4:"role";a:1:{i:0;s:13:"administrator";}s:13:"role_frontend";a:1:{i:0;s:13:"administrator";}s:5:"radio";i:0;s:4:"date";s:0:"";}', 'yes'),
编辑2:
现在使用wp cli
执行搜索和替换任务。
我有一个多站点设置,博客编号为(2,3,9)。
执行wp search replace--url=360.example.com'360.example.com''360-dev.my.example.dev'
会导致错误,告诉我无法找到单个站点表(wp\u重定向\u项和wp\u重定向\u组)。
这是真的,因为它们确实不存在,而是针对每个博客(例如:wp_2_重定向_项目等等)。该错误导致s&r中有9000多起遗漏事件。可以使用wp search replace--url=360.example.com'360.example.com''360-dev.my.example.com'wp.*替换所有内容。但是它仍然会抛出错误。正如@archimiro所建议的,现在任务由完成。 但由于我也有一个多站点设置,这导致了一些错误,我必须找出一个完整的数据库搜索替换任务的命令 最后的命令是:
wp search replace--url=360.example.com'360.example.com''360-dev.my.example.dev'wp.*
。
如果不明确告诉wp cli在所有(
wp_*
)表中搜索和替换,它将在抛出“table not found”(未找到表)错误时停止运行。我过去曾成功地使用过此方法:
sed 's|360\.example\.com|360-dev\.my\.example\.dev|g' com.sql > local.sql
编辑:对不起,不是awk,但wp-cli也不是。也不是awk或wpcli,但这是我编写的一个php函数,似乎运行良好
function snr($search, $replace, $inputfile, $outputfile){
$sql = file_get_contents($inputfile);
$sql1 = str_replace($search,$replace,$sql);
file_put_contents($outputfile,$sql1);
$serstrings = preg_split("/(?<=[{;])s:/",$sql1);
foreach($serstrings as $i=>$serstring) {
if (!!strpos($serstring, $replace)){
$justString = str_replace("\\","",str_replace("\\\\","j",explode('\\";',explode(':\\"',$serstring)[1])[0]));
$correct = strlen($justString);
$serstrings[$i] = preg_replace('/^\d+/',$correct, $serstrings[$i]);
}
}
file_put_contents($outputfile,implode("s:",$serstrings));
}
函数snr($search、$replace、$inputfile、$outputfile){
$sql=file\u get\u contents($inputfile);
$sql1=str_replace($search,$replace,$sql);
文件内容($outputfile,$sql1);
$serstrings=preg_split(“/”(?您能使用吗?它可以很容易地做到这一点:实际上我已经在使用wp cli,但确实监督了该命令……很抱歉打扰您!如果它满足我的需要,我将尝试它并让您不断更新!:)该命令已经帮了很多忙。但是它抛出了一个错误,并告诉我它找不到表“wp_重定向”项我在这里有一个多站点设置,所以这些表实际上不存在,但是“wp_2_重定向_项”等等…有什么办法解决这个问题吗?