Мы можем заменить любые /
предшествующие 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}'