Mysql sed从sql转储中删除定义器

Mysql sed从sql转储中删除定义器,mysql,bash,sed,Mysql,Bash,Sed,我已经在谷歌上搜索并尝试了may的建议,但似乎没有一个能够删除所有出现的“DEFINER=” 这是其中的一些例子 /*!50013 DEFINER=`root`@`localhost`*/ /*!50013 DEFINER=`root`@`%` SQL SECURITY DEFINER */ /*!50013 DEFINER=`root`@`192.168.42.20` SQL SECURITY DEFINER */ 我尝试了一种不同的方法,尝试替换第一个空格之前的所有内容,虽然regex在

我已经在谷歌上搜索并尝试了may的建议,但似乎没有一个能够删除所有出现的“DEFINER=”

这是其中的一些例子

/*!50013 DEFINER=`root`@`localhost`*/
/*!50013 DEFINER=`root`@`%` SQL SECURITY DEFINER */
/*!50013 DEFINER=`root`@`192.168.42.20` SQL SECURITY DEFINER */
我尝试了一种不同的方法,尝试替换第一个空格之前的所有内容,虽然regex在regex101上工作,但在sed的命令行中不起作用:

cat mydb.sql | grep DEFINER= | sed -e 's/DEFINER=[^\s]+/ /'
有没有关于如何让sed使用此功能的建议

编辑 在浏览了这个巨大的转储文件之后,我还发现了som实例,其中末尾没有空格,而是一个*,因此我更新了上面的测试文本

这似乎是可行的:

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

你在MacOS上吗?此regexp在Linux上工作:

 cat mydb.sql | grep DEFINER= | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/'
如果使用
\s
而不仅仅是空格,则第一行是:

/*!50013  st` SQL SECURITY DEFINER */

$ sed --version
sed (GNU sed) 4.2.2

您不需要使用
cat
grep
。试试这个:

$ 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使用的扩展,可能无法在您的系统上工作。改用
[:space://code>(或
[:blank://code>只匹配空格和制表符)。

作为一个稍微不同的解决方案-我从sed开始,但尝试了不同的方法,因为它的正则表达式非常有限(我想使用lookahead)因此,我使用了一个perl one liner,在这里我可以使用完整的pcre,我可以轻松地在notepad+等中进行测试:

#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文件,尽管没有指定。如果不发生这种情况,
rm
可能会被忽略

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

这将处理
/*!…*/
CREATE…FUNCTION
之间的定义。我只在
mysqldump
的输出上尝试过它,效果很好(我尝试过文件大小高达165Mb的SQL转储,它很快就完成了)

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

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