2016-09-20 81 views
0

使用的sed我想刪除「AS」在下面的字符串的一部分,字符串模式替換掉殼牌

CONV.BUY AS BUY, CONV.CUSTOM1 AS CUSTOM1 , TP.BUY AS BUY, TP.CUSTOM1 AS CUSTOM1 

應改爲

CONV.BUY, CONV.CUSTOM1, TP.BUY, TP.CUSTOM1 

我所做的是

echo $string | sed -e 's/ AS.*\,/\,/g' 

哪給出

CONV.BUY, TP.CUSTOM1 AS CUSTOM1 

在該sed中過濾掉了兩個字段。有沒有更好的解決方案來實現我的目標,而不使用循環?

回答

1

sed隨着:

sed 's/[[:blank:]]AS[^,]*//g' 
  • [[:blank:]]AS由一個空白前面比賽AS,然後[^,]*高達下一,匹配。所有這些匹配部分通過替換爲空來刪除。

實施例:

% sed 's/[[:blank:]]AS[^,]*//g' <<<'CONV.BUY AS BUY, CONV.CUSTOM1 AS CUSTOM1 , TP.BUY AS BUY, TP.CUSTOM1 AS CUSTOM1' 
CONV.BUY, CONV.CUSTOM1, TP.BUY, TP.CUSTOM1 
+0

完美..如果你不介意,可以請你解釋'AS [^,] +'部分在sed?以及它如何替換沒有逗號的實例 –

+0

@OptimusPrime當然。請注意,這裏'AS [^,] *'可以,不需要'+'(這是一個Exteneded正則表達式模式,匹配前面的一個或多個令牌)。因此,在AS [^,] *'中,'AS'字面上與'AS'匹配,'[^,]'匹配除','以外的任何字符,下面的*匹配零個或多個這樣的字符,匹配一切,直到下一個','。 – heemayl

+0

使感覺!還有一個問題,我們可以在該sed中進行調整以使'AS'不區分大小寫嗎?即如果它是'AS'或'as'則匹配? –

1

可以使用否定的字符類作爲

sed 's/AS[^,]*//g' 
  • [^,]*匹配零個或多個非,字符。這意味着它相匹配,直到眼前,,並與空替換

>>> echo "EONV.BUY AS BUY, CONV.CUSTOM1 AS CUSTOM1 , TP.BUY AS BUY, TP.CUSTOM1 AS CUSTOM1" | gsed 's/AS[^,]*//g' 
EONV.BUY , CONV.CUSTOM1 , TP.BUY , TP.CUSTOM1