cat myfile.sql
DELIMITER $$
USE `AA4`$$
DROP TRIGGER /*!50032 IF EXISTS */ `AT_Card_INSERT_Trigger`$$
CREATE
/*!50017 DEFINER='root'@'%' */
TRIGGER `AT_Card_INSERT_Trigger` AFTER INSERT ON `card`
FOR EACH ROW BEGIN
以下按预期工作并删除definer子句。
sed -e 's/DEFINER=[^*]*\*/\*/' myfile.sql
但是在等于符号之后或之前它不适用于空格。对于例如如果我有这样一条线......
/*!50017 DEFINER = 'root'@'%' */
然后我需要一个像这样的sed语句......
sed -e 's/DEFINER\ =\ [^*]*\*/\*/' myfile.sql
但是还有2个可能的空间(前面没有空格,后面没有空格)。 “=”之前或之后也可能有多于1个空格。 我如何处理这一切?
答案 0 :(得分:2)
您只需添加*
(单个空格后跟*
)即可匹配零个或多个空格:
sed -e 's/DEFINER *= *[^*]*\*/\*/' myfile.sql
如果您使用的是OSX,则可以使用以下空格来允许更多的空格:
# OSX
sed -E -e 's/DEFINER[[:space:]]*=[[:space:]]*[^*]*\*/\*/' myfile.sql
如果您使用-r
代替-E
,则同样适用于GNU sed(1):
# GNU
sed -r -e 's/DEFINER[[:space:]]*=[[:space:]]*[^*]*\*/\*/' myfile.sql
GNU sed(1)也了解空格的\s
:
# GNU
sed -r -e 's/DEFINER\s*=\s*[^*]*\*/\*/' myfile.sql
答案 1 :(得分:1)
你已经知道如何使用Kleene星;它也适用于空间:
sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' myfile.sql
仅处理空格。如果您还需要标签,请将其放入[ ]
部分。如果你有一个知道\s
的扩展sed,你可以变得更加漂亮。