在没有替换匹配之前,如何告诉sed重复替换?

时间:2017-07-21 18:53:31

标签: unix sed

如果没有替换匹配,我怎么告诉sed重复替换?

如果做echo x | sed 's/x/xx/g'我很高兴sed不会在输出上重启。

但如果我有,请说echo 'x,a,b,x,x,c,x,d,e,x,x,x,f,x' | sed 's/,x,/,y,/g' 它没有用x代替y,原因很明显:先前的替换已经消耗了周围的分隔符。

我知道我对第一个和最后一个x也有一个小问题,但我忽略了这个问题的简单性。

编辑:我必须澄清这个问题,正如已经提到过但仅在评论中:我希望看到每个x都被y替换,但只有它本身就是一个单词,在本例中用分隔符,逗号括起来,但如果有办法应对更复杂的分隔符,这将是受欢迎的。

(没办法陷入y2k陷阱,周一被Mondak取代,只是开玩笑。)

3 个答案:

答案 0 :(得分:2)

使用\b作为单词分隔符。

$ echo 'x,xx,x,x' | sed 's/\bx\b/y/g'
y,xx,y,y

\b表示单词边界,但即使在捕获组中使用,它也不会导致替换单词外的字符(如果有的话)。

答案 1 :(得分:0)

试试这个:

$ echo 'x,a,b,x,x,c,x,d,e,x,x,x,f,x' | sed 's/x/y/g'
y,a,b,y,y,c,y,d,e,y,y,y,f,y

答案 2 :(得分:0)

$ echo 'x,a,b,x,x,c,x,d,e,x,x,x,f,x' | sed ':label; s/,x,/,y,/g; t label;'
x,a,b,y,y,c,y,d,e,y,y,y,f,x

?这不会取代边缘的x,但没有明确要求。

它也不会替换单词中的x

$ echo 'x,a,b,fix,x,c,x,d,e,x,x,x,f,x' | sed ':label; s/,x,/,y,/g; t label;'
x,a,b,fix,y,c,y,d,e,y,y,y,f,x

说明:如果发生了某些替换,t命令将跳转到标签。它将再次将相同的sed表达式应用于该行。