sed заменить путь unix на переменную, содержащую другой путь unix

sed заменить путь unix на переменную, содержащую другой путь unix

Мне нужно заменить Unix-путь через sed на переменную, содержащую другой Unix-путь в скрипте bash

Пример:

another_unix_path=/another/unix/path
sed -i 's/ \/some\/path\/file.txt/ '$another_unix_path'/g' some_file.txt

решение1

Вам необходимо экранировать специальные символы:

another_unix_path="\/another\/unix\/path"
echo /some/path/file.txt | sed -e 's/\/some\/path\/file.txt/'$another_unix_path'/g'

Что выводит такой результат:

/другой/unix/путь

решение2

/Возможен вариант экранирования специальных символов .

Вы также можете изменить sedразделитель по умолчанию (который является /), используя ?, например:

another_unix_path="/another/unix/path"
echo /some/path/file.txt | sed -e 's?/some/path/file.txt?'$another_unix_path'?g'

Символ, используемый сразу после sфлага, определяет, какой разделитель будет использоваться:s?

Редактировать :

#!/bin/sh
basepath=/another/unix/path
baseurl=/base/url
sed -i 's?# set $IMAGE_ROOT /var/www/magento2;? set $IMAGE_ROOT '$basepath$baseurl';?g' somefile.txt

решение3

Если вы используете /разделители, то вам придется экранировать все /на своем пути, напримерsed 's/\/some\/path/'$replacement'/g'

К счастью, sed, как и Perl, позволяет использовать в качестве разделителей множество символов, поэтому вы также можете писать sed 's#/some/path#'$replacement'#g'( gфлаг используется для разрешения замены нескольких вхождений в строке).

Кроме того, sed не позволит производить замену на месте, если вы запустите его для файла, то есть вам придется записывать данные во временный файл и перемещать его. Обновлять:на самом деле, Gnu's sedделаетесть вариант на месте, который работает как Perl: -iили -i.extгде .extнаходится резервное расширение. Perl может быть предпочтительнее для переносимости.

Для замены на месте можно использовать Perl следующим образом:

# In-place without backup:
perl -pi -e 's#/some/path#'$replacement'#g' <file>

# In-place with backup as .orig (note .orig is glued to the -i switch):
perl -pi.orig -e 's#/some/path#'$replacement'#g' <file>

Будьте осторожны со второй командой, так как если вы введете ее дважды, вы перезапишете свою первую резервную копию!

Связанный контент