如果没有替换匹配,我怎么告诉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取代,只是开玩笑。)
答案 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表达式应用于该行。