(Gnu)sed命令,用于更改行的匹配部分

(Gnu)sed命令,用于更改行的匹配部分,sed,Sed,在(Gnu)sed中是否有方法替换字符串匹配部分中的所有字符?例如,我可能有一个文件路径列表,每行中有几个(任意数量的)路径,例如: /a/b/c/d/e /f/g/XXX/h/i /j/k/l/m /n/o/p /q/r/s/t/u /v/x/x/y /z/XXX/a/b /c/d/e/f 我想替换包含XXX keping的路径中的所有斜线,并替换所有未触及的其他斜线,例如: /a/b/c/d/e #f#g#XXX#h#i /j/k/l/m /n/o/p /q/r/s/t/u /v/x/x/

在(Gnu)
sed
中是否有方法替换字符串匹配部分中的所有字符?例如,我可能有一个文件路径列表,每行中有几个(任意数量的)路径,例如:

/a/b/c/d/e /f/g/XXX/h/i /j/k/l/m
/n/o/p /q/r/s/t/u /v/x/x/y
/z/XXX/a/b /c/d/e/f
我想替换包含XXX keping的路径中的所有斜线,并替换所有未触及的其他斜线,例如:

/a/b/c/d/e #f#g#XXX#h#i /j/k/l/m
/n/o/p /q/r/s/t/u /v/x/x/y
#z#XXX#a#b /c/d/e/f

不幸的是,我不能想出一个解决办法。也许使用
sed
甚至是不可能的。但是我很好奇是否有人能找到解决问题的方法。

我们可以用没有如下空格的插入来替换前面的
/

# Using extended regex syntax
s!/([^ ]*XXX)!#\1!
这是一个非常类似的替代品,用于后面的
XXX

将它们放在一个循环中使该程序:

#!/bin/sed -rf

:loop
s!/([^ ]*XXX)!#\1!
s!(XXX[^ ]*)/!\1#!
tloop
输出:

/a/b/c/d/e#f#g#XXX#h#i/j/k/l/m
/n/o/p/q/r/s/t/u/v/x/x/y
#z#XXX#a#b/c/d/e/f

也就是说,使用管道可能更简单,将文件路径分解为单独的行,然后在替换后重新组装:

sed-e的/*$/;s/*/&\n/g'\
|sed-e'/XXX/y,/,#,'\
|sed-e':a;/$/{N;s/\N/;ba}'

我们可以将任何
/
前面的
XXX
替换为没有这样的中间空格:

# Using extended regex syntax
s!/([^ ]*XXX)!#\1!
这是一个非常类似的替代品,用于后面的
XXX

将它们放在一个循环中使该程序:

#!/bin/sed -rf

:loop
s!/([^ ]*XXX)!#\1!
s!(XXX[^ ]*)/!\1#!
tloop
输出:

/a/b/c/d/e#f#g#XXX#h#i/j/k/l/m
/n/o/p/q/r/s/t/u/v/x/x/y
#z#XXX#a#b/c/d/e/f

也就是说,使用管道可能更简单,将文件路径分解为单独的行,然后在替换后重新组装:

sed-e的/*$/;s/*/&\n/g'\
|sed-e'/XXX/y,/,#,'\
|sed-e':a;/$/{N;s/\N/;ba}'

这些都是有趣的解决方案,对我来说就是这样。谢谢。这些都是有趣的解决方案,对我来说很有用。非常感谢。