Mysql sed从sql转储中删除定义器
我已经在谷歌上搜索并尝试了may的建议,但似乎没有一个能够删除所有出现的“DEFINER=” 这是其中的一些例子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在
/*!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