1

Web サイトの移行のために、SQL ダンプ内の fqdn を置き換える必要があります。STDIN を受け取り、置き換えられるはずのドメイン名を含むシリアル化された文字列を置き換え、スクリプトに渡された引数に置き換えて、STDOUT に出力する perl フィルターを作成しました。

これは私がこれまでに持っているものです:

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んでした。私はおそらくこれを非常に迂遠な方法で行っているか、明らかな何かを見逃しています。どんな助けでも大歓迎です。

4

3 に答える 3

1

補間された文字列にエスケープされたピリオドが含まれるようにするには\、変数のエスケープ文字を 2 倍にする必要があります。$search

ie domain\.to\.be\.replaced-> domain.to.be.replaced(望まない)

while domain\\.to\\.be\\.replaced-> domain\.to\.be\.replaced(正解)。

于 2013-03-22T23:18:00.263 に答える