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

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

Пример:

another_unix_path=/another/unix/path
sed -i 's/ \/some\/path\/file.txt/ '$another_unix_path'/g' some_file.txt
0
задан 20 May 2015 в 15:07
3 ответа

Вам нужно экранировать специальные символы:

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

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

/ another / unix / path

-1
ответ дан 4 December 2019 в 12:27

Escaping special char / - это вариант.

Вы также можете изменить разделитель по умолчанию 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
ответ дан 4 December 2019 в 12:27

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

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

Также sed не разрешит замену на месте, если вы запустите ее для файла, что означает g вам нужно будет записать во временный файл и переместить его. Обновление: на самом деле, у Gnu 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>

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

1
ответ дан 4 December 2019 в 12:27

Теги

Похожие вопросы