出于网站迁移的目的,我必须在 SQL 转储中替换 fqdn。我编写了一个应该采用 STDIN 的 perl 过滤器,替换包含应该替换的域名的序列化字符串,用传递给脚本的任何参数替换它,然后输出到 STDOUT。
这是我到目前为止所拥有的:
my $search = $ARGV[0];
my $replace = $ARGV[1];
my $offset_s = length($search);
my $offset_r = length($replace);
my $regex = eval { "s\:([0-9]+)\:\\\"(https?\://.*)($search.*)\\\"" };
while (<STDIN>) {
my @fs = split(';', $_);
foreach (@fs) {
chomp;
if (m#$regex#g) {
my ( $len, $extra, $str ) = ( $1, $2, $3 );
my $new_len = $len - $offset_s + $offset_r;
$str =~ eval { s/$search/$replace/ };
print 's:' . $new_len . ':' . $extra . $str . '\"'."\n";
}
}
}
过滤器获取可能看起来像这样的传递数据(这取自 wordpress 转储,但我们也应该适应 drupal 转储:
INSERT INTO `wp_2_options` VALUES (1,'siteurl','http://to.be.replaced.com/wordpress/','yes'),(125,'dashboard_widget_options','
a:2:{
s:25:\"dashboard_recent_comments\";a:1:{
s:5:\"items\";i:5;
}
s:24:\"dashboard_incoming_links\";a:2:{
s:4:\"home\";s:31:\"http://to.be.replaced.com/wordpress\";
s:4:\"link\";s:107:\"http://blogsearch.google.com/blogsearch?scoring=d&partner=wordpress&q=link:http://to.be.replaced.com/wordpress/\";
}
}
','yes'),(148,'theme_175','
a:1:{
s:13:\"courses_image\";s:37:\"http://to.be.replaced.com/files/image.png\";
}
','yes')
如果我的$search
. 我试过转义句号,即domain\.to\.be\.replaced
,但这没有用。我可能是以一种非常迂回的方式来做这件事,或者遗漏了一些明显的东西。任何帮助将不胜感激。