Regex 删除额外空间
cat myfile.sqlRegex 删除额外空间,regex,sed,Regex,Sed,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 以下内容按预期工作,并删除了defi
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 -e 's/DEFINER\ =\ [^*]*\*/\*/' myfile.sql
然后我需要一份sed声明,类似这样的
/*!50017 DEFINER = 'root'@'%' */
sed -e 's/DEFINER\ =\ [^*]*\*/\*/' myfile.sql
但是还有两种可能是空间(前面没有空间,后面没有空间)。也可能在“=”之前或之后有超过1个空格。
如何处理这些问题?您只需添加
*
(一个空格后跟*
)即可匹配零个或多个空格:
sed -e 's/DEFINER *= *[^*]*\*/\*/' myfile.sql
如果您使用的是OSX,您可以使用以下方法允许更多的空格,而不仅仅是空格:
# OSX
sed -E -e 's/DEFINER[[:space:]]*=[[:space:]]*[^*]*\*/\*/' myfile.sql
如果使用-r
代替-E
,GNUsed(1)也同样适用:
# GNU
sed -r -e 's/DEFINER[[:space:]]*=[[:space:]]*[^*]*\*/\*/' myfile.sql
GNUsed(1)也能理解\s
中的空格:
# GNU
sed -r -e 's/DEFINER\s*=\s*[^*]*\*/\*/' myfile.sql
您只需添加
*
(一个空格后跟*
)即可匹配零个或多个空格:
sed -e 's/DEFINER *= *[^*]*\*/\*/' myfile.sql
如果您使用的是OSX,您可以使用以下方法允许更多的空格,而不仅仅是空格:
# OSX
sed -E -e 's/DEFINER[[:space:]]*=[[:space:]]*[^*]*\*/\*/' myfile.sql
如果使用-r
代替-E
,GNUsed(1)也同样适用:
# GNU
sed -r -e 's/DEFINER[[:space:]]*=[[:space:]]*[^*]*\*/\*/' myfile.sql
GNUsed(1)也能理解\s
中的空格:
# GNU
sed -r -e 's/DEFINER\s*=\s*[^*]*\*/\*/' myfile.sql
你已经知道如何使用克莱恩星;它也适用于空间:
sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' myfile.sql
它只处理空格。如果您还需要选项卡,请将它们也放入
[]
部分。如果你有一个了解\s
的扩展sed,你甚至可以变得更花哨。你已经知道如何使用Kleene star;它也适用于空间:
sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' myfile.sql
它只处理空格。如果您还需要选项卡,请将它们也放入
[]
部分。如果你有一个了解\s
的扩展sed,你会变得更漂亮。你的sed更好。没有括号。@Ray:不,你的括号更好,因为括号:P很难区分一个空格和两个空格。有时候,括号消除了任何歧义。你的更好。没有括号。@Ray:不,你的括号更好,因为括号:P很难区分一个空格和两个空格。有时,括号消除了任何歧义。单元素类不是必需的,但它们很好地澄清了单个空格。我习惯了括号,因为sed(至少在Mac上)没有\s
,所以我经常写[\t]
或[\t\n\r]
:)总是有perl-pe
或sed-E
和[:space:]]
。单元素类不是必需的,但它们很好地澄清了单个空格。我习惯了括号,因为sed(至少在Mac上)没有\s
,所以我经常写[\t]
或[\t\n\r]
)总是有perl-pe
或sed-E
和[:space:]
。