删除额外的空间

时间:2011-07-27 05:14:51

标签: 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

以下按预期工作并删除definer子句。

sed -e 's/DEFINER=[^*]*\*/\*/' myfile.sql

但是在等于符号之后或之前它不适用于空格。对于例如如果我有这样一条线......

/*!50017 DEFINER = 'root'@'%' */

然后我需要一个像这样的sed语句......

sed -e 's/DEFINER\ =\ [^*]*\*/\*/' myfile.sql

但是还有2个可能的空间(前面没有空格,后面没有空格)。 “=”之前或之后也可能有多于1个空格。 我如何处理这一切?

2 个答案:

答案 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,你可以变得更加漂亮。