(Gnu)sed命令更改线的匹配部分

时间:2018-11-16 15:13:35

标签: 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 的路径中的所有斜杠,使其他所有未触动的斜杠保持不变,例如:

/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甚至可能是不可能的。但是我很好奇是否有人找到解决问题的方法。

1 个答案:

答案 0 :(得分:2)

我们可以将/之前的任何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/ *$//;s/  */&\n/g' \
  | sed -e '/XXX/y,/,#,' \
  | sed -e ':a;/ $/{N;s/\n//;ba}'