Unix 我如何告诉sed重复替换直到没有匹配项被替换?

Unix 我如何告诉sed重复替换直到没有匹配项被替换?,unix,sed,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替换,但前提是它本

我如何告诉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,只是开玩笑。)

试试这个:

$ 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

使用
\b
作为单词分隔符

$ echo 'x,xx,x,x' | sed 's/\bx\b/y/g' y,xx,y,y $echo'x,xx,x,x'| sed's/\bx\b/y/g' y、 xx,y,y
\b
表示单词边界,但即使在捕获组中使用,也不会导致替换单词外的字符(如果有)。

怎么办

$ 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表达式。

您有不同的输入和不同的替换。你的目标是什么?@johngofy我想看到y,a,b,y,y,c,y,d,e,y,y,y,f,y作为一个输出,如果一个单词中意外地有一个x,比如说abxcd,被分隔符包围,那么就不需要替换x。
echo'x,x,x'| sed's/,x,/,y,/g'
将是一个更简单的例子。是否要替换所有x?还是只在逗号内?@hek2mgl仅在“分隔符”内,正好是逗号。我不想把恶作剧转换成恶作剧。这种问题更适合于使用lookarounds的正则表达式:
echo'x,a,b,x,x,c,x,d,e,x,x,x,f,x'| perl-pe's/(^ |,)\Kx=,|$)/y/g'
OP请求不要用“fiy”替换“fix”。这很好,就这样结束了。我只想看看是否有一种更简单、更通用的方法来实现这一点,即使这样,分隔符也不会是逗号,而是单词的组成字符。我不确定你的意思。大多数情况下,人们不使用
\w
集合中的字符作为分隔符,因为其中有无数个包含这些字符的单词。确切地说:“大多数情况下”,如果你有其他问题,你可以问不同的问题。你还没有解释你在找什么。您需要定义一组分隔符和有效单词chars@sundeep在OP注释中有一个perl解决方案,可以用于任何任意分隔符
(^ | d)。。(d |$)
其中
d
是分隔符。你会遇到拆分任何包含
d
的单词的问题。