2011-07-27 168 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有時候很難區分一個空間和兩個空間,括號可以消除任何不明確的地方。 –