2011-07-27 62 views
0

猫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 

下按预期工作,并删除定义者条款。

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

但它不适用于符号之前或之后的空格。对于例如如果我有这样一行...

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

然后,我需要一个sed声明是这样的......

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

但也有2个possibilites与空间(没有空间之前,没有空间之后)。 “=”之前或之后可能有超过1个空格也是可能的。 我该如何处理这一切?

回答

1

你已经知道如何使用克林星;它也适用于空间:

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

仅处理空格。如果您还需要标签,请将它们放入[ ]部分。如果你有一个知道\s的扩展sed,你可以更有趣。

+0

单元素类不是必需的,但它们是澄清单个空间的不错选择。 –

+0

我习惯了括号,因为sed(至少在Mac上)没有'\ s',所以我经常写'[\ t]'或'[\ t \ n \ r]''。 :) –

+1

总是有'perl -pe'或'sed -E'和'[[:space:]]''。 –

2

您可以再补充*(一个空格,然后*)来匹配零个或多个空格:

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

如果你在OSX上,你可以允许比使用这只是空间的多个空白:

# OSX 
sed -E -e 's/DEFINER[[:space:]]*=[[:space:]]*[^*]*\*/\*/' myfile.sql 

,并同样将与GNU 工作的sed(1)如果您在使用场所的-r-E

# GNU 
sed -r -e 's/DEFINER[[:space:]]*=[[:space:]]*[^*]*\*/\*/' myfile.sql 

GNU 的sed(1)也明白\s为空白:

# GNU 
sed -r -e 's/DEFINER\s*=\s*[^*]*\*/\*/' myfile.sql 
+0

你的更好。没有括号。 –

+0

@射线:不,由于括号的存在,你的更好:P有时候很难区分一个空间和两个空间,括号可以消除任何不明确的地方。 –