2016-09-20 84 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