使用AWK在Wordpress SQL转储中安全地搜索和替换URL

使用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 如果匹配项也与序列化字符串

我正在开发一个webtool,将Wordpress安装镜像到开发系统中

其目的是拥有一个用于生产的实时系统和一个用于测试的开发系统。然后,webtool提供了这些系统之间的一键同步。 每个系统都是独立的,有自己的webroot、数据库和url

我在数据库转储中遇到问题,我必须搜索对源的所有引用,并将它们替换为目标的URL(例如:“www.example.com”->“www-dev.example.com”)

我需要做的是:

  • 查找所有出现的URL,并将其替换为新URL

  • 如果匹配项也与序列化字符串的格式匹配,则应设置字段分隔符,并重新加载匹配项,以便在数组中设置实际长度

  • 在第一次尝试中,我尝试使用如下的“sed”命令来解决这个问题:
    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_重定向_项”等等…有什么办法解决这个问题吗?