sed - (Gnu) 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
。但我很好奇是否有人找到解决问题的方法。
解决方案
我们可以像这样替换任何/
前面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}'