(Gnu) команда sed, чтобы изменить соответствующую часть строки - PullRequest
0 голосов
/ 16 ноября 2018

Есть ли способ (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 голосов
/ 16 ноября 2018

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