sed从sql dump中删除DEFINER

时间:2016-08-01 04:34:18

标签: mysql bash sed

我已经谷歌搜索并尝试过建议,但似乎没有人能够删除所有'DEFINER ='事件。

Remove DEFINER clause from MySQL Dumps

这些是一些事件

/*!50013 DEFINER=`root`@`localhost`*/
/*!50013 DEFINER=`root`@`%` SQL SECURITY DEFINER */
/*!50013 DEFINER=`root`@`192.168.42.20` SQL SECURITY DEFINER */

我尝试了一种不同的方法,尝试将所有内容替换为第一个空格,而正则表达式在regex101上运行时,它将无法在命令行中使用sed:

cat mydb.sql | grep DEFINER= | sed -e 's/DEFINER=[^\s]+/ /'

有关如何使用sed的任何建议吗?

修改

在浏览了这个巨大的转储文件之后,我还发现了最终没有空格的som事件,而是有一个*,所以我更新了上面的测试文本。

这似乎有效:

's/DEFINER=[^ |\*]*//'

4 个答案:

答案 0 :(得分:2)

您不需要使用catgrep。试试这个:

$ sed -e 's/DEFINER=[^[:space:]]\+ //' mydb.sql
/*!50013  `root`@`localhost` SQL SECURITY DEFINER */
/*!50013  `root`@`%` SQL SECURITY DEFINER */
/*!50013  `root`@`192.168.42.20` SQL SECURITY DEFINER */
/*!50003 CREATE OR REPLACE*/ /*!50017 */ /*!50003 TRIGGER WORKORDER_BU BEFORE UPDATE ON WORK_ORDER

要编辑文件,请使用-i选项:

$ sed -i 's/DEFINER=[^[:space:]]\+ //' mydb.sql

使用您的模式[^\s]+,您可以搜索非空格字符[^\s],后跟+符号。要将一个或多个字符与+匹配,您必须在BRE模式下将其\+转义:

sed -e 's/DEFINER=[^[:space:]]\+ //' mydb.sql

此外,字符类\s i作为GNU sed扩展名,可能无法在您的系统上运行。请改用[:space:](或[:blank:]来匹配空格和制表符。)

答案 1 :(得分:1)

$ cat mydb.sql | grep DEFINER= | sed -e 's/DEFINER=[^ ]\+/ /g'
/*!50013   SQL SECURITY DEFINER */
/*!50013   SQL SECURITY DEFINER */
/*!50013   SQL SECURITY DEFINER */

如果使用\s而不是空格,则第一行是:

/*!50013  st` SQL SECURITY DEFINER */

$ sed --version
sed (GNU sed) 4.2.2

答案 2 :(得分:1)

作为一个稍微不同的解决方案 - 我从sed开始,但尝试了一种不同的方法,因为它有如此有限的正则表达式(我想使用前瞻)所以使用perl单行代替我可以使用完整的pcre我可以在记事本+等中轻松测试:

#strip DEFINER out of dump (tmp SQL file)
perl -pi -e 's/\bDEFINER=.*?@.*?(?=[\*\s])//g' "${FILE}"
rm "${FILE}".bak     2> /dev/null

这是bash脚本的一部分,因此是FILE变量。出于某种原因,mingw中的perl(在w10上)坚持创建.bak文件,尽管没有指定.bak文件。如果没有发生,rm可能被遗漏。

(?=前瞻意味着我可以找到结束该术语的*或空格,而无需找到将其放回替换中的方法。 [与任何正则表达式解决方案一样,我打赌还有很多其他方法可以做到这一点!]

这会处理/*! ... */CREATE ... FUNCTION之间的定义器之间的定义器。我只在mysqldump的输出上尝试了它的工作正常(我尝试的文件大小高达165Mb) SQL转储,它很快就扼杀了它。)

所有这些简单的正则表达式方法的障碍是,如果碰巧存在于数据中,他们会找到正则表达式术语并将其删除,因此更安全的解决方案会将结构和数据转储划分为单独的文件并仅处理结构文件。我没有必要这样做,但要记住这件事。 (我使用@等使正则表达式非常具体,以试图避免这个问题)

答案 3 :(得分:0)

你在MacOS上吗?这个正则表达式适用于Linux:

 cat mydb.sql | grep DEFINER= | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/'