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
3 ответа
Вам нужно экранировать специальные символы:
another_unix_path="\/another\/unix\/path"
echo /some/path/file.txt | sed -e 's/\/some\/path\/file.txt/'$another_unix_path'/g'
Который выводит этот результат:
/ Другой / Unix/ путь
Экранирование специального символа /
это вариант.
Вы также можете изменить значение по умолчанию 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
Если вы используете /
для разделителей, то вам придется избегать каждого /
на вашем пути, бывший sed 's/\/some\/path/'$replacement'/g'
К счастью sed - как Perl - позволяет использовать много символов в качестве разделителей, так что вы также можете написать sed 's#/some/path#'$replacement'#g'
(g
флаг используется для замены нескольких вхождений в строке).
Также sed не разрешит замену на месте, если вы запустите его для файла, то есть вам придется записать во временный файл и переместить его. Обновление: на самом деле, у sed Gnu есть опция на месте, которая работает как 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>
Будьте осторожны со второй командой, так как, если вы введете ее дважды, вы перезапишете свою первую резервную копию!