如何通过管道传输 Sed 命令?

如何通过管道传输 Sed 命令?

我有一个 bash 脚本,可以非常可靠地为我导入 WordPress 数据库,但我的一个站点来自以前的 WordPress 多站点,因此该数据库在数据库中包含 DEFINERS,这会阻止以下代码正确执行

gunzip -c $destination_path_to_wordpress/folder/db-export.sql.gz | mysql -u $destination_db_user -p$destination_db_pass $destination_db_name

上面的结果是ERROR 1227 (42000) at line 3224: Access denied; you need (at least one of) the SUPER or SET_USER_ID privilege(s) for this operation

如果我手动导出数据库,然后运行sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i db-export.sql,然后尝试导入数据库,那么我可以成功导入数据库,搜索替换用户名,并将其实时站点。

问题:
将我当前的 db import 命令和 sed 命令结合起来消除定义器问题的正确语法是什么?我想要实现的目标如下:

显然不正确,但你明白了要点......

gunzip -c $destination_path_to_wordpress/folder/db-export.sql.gz | `sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i db-export.sql | mysql -u $destination_db_user -p$destination_db_pass $destination_db_name

有小费吗?

谢谢


答案1

在这种情况下,您希望处理来自文件的数据而不是来自文件的sed数据。gunzip省略文件名,它会很乐意从中读取标准输入(即从gunip)并写信至标准输出(即mysql)。

为了便于阅读,我将其分为三行。它仍然会像这样工作,但如果您确实愿意,可以将这些行连接在一起:

gunzip -c "$destination_path_to_wordpress/folder/db-export.sql.gz" |
    sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' |
    mysql -u "$destination_db_user" -p"$destination_db_pass" "$destination_db_name"

相关内容