Я пытаюсь использовать sed
для замены некоторых строк PHP.
Моя проблема в том, что я хочу заменить строку переменными PHP на строку, включающую переменную Bash.
Вот пример:
sudo sed -i 's/$sUrl . $this_sOutDir/https:\/\/'$bucketname'.s3.amazonaws.com . $this->_sOutDir/g' /var/www/html/$name/core/oxconfig.php
Как видите, я хочу заменить $sUrl . $this->_sOutDir
(в буквальном смысле) URL-адресом s3, который включает переменную Bash. Я пытаюсь использовать двойные кавычки, но это не работает для меня:
sudo sed -i 's/$sUrl . $this_sOutDir/https:\/\/"$bucketname".s3.amazonaws.com . $this->_sOutDir/g' /var/www/html/$name/core/oxconfig.php
Я также пытаюсь использовать полный s/...
в двойных кавычках, но это не работает, потому что sed
считает, что Первые переменные также являются переменными Bash.
Результат:
return https://.s3.amazonaws.com . $this->_sOutDir . '/';
Можно пойти двумя различными путями:
Используя одинарные кавычки: убегите из одинарных кавычек и сошлитесь на переменную (использующий двойные кавычки для предотвращения разделения слова и расширения имени файла):
sudo sed -i 's/$sUrl . $this_sOutDir/https:\/\/'"$bucketname"'.s3.amazonaws.com . $this->_sOutDir/g' /var/www/html/$name/core/oxconfig.php
Используя двойные кавычки: выйдите $
символы, которые будут рассматривать буквально:
sudo sed -i "s/\$sUrl . \$this_sOutDir/https:\/\/$bucketname.s3.amazonaws.com . \$this->_sOutDir/g' /var/www/html/$name/core/oxconfig.php
Однако протест: если $bucketname
содержит sed
специальные символы / последовательности, sed
команда повредится (в этом случае, так как переменная должна быть расширена в заменяющем разделе, беспокойство об этом возможно содержащий разделитель, случайные обратные ссылки или &
.
Одним способом обойти это является sanitazing переменная заранее путем выхода из возможных разделителей, случайных обратных ссылок и &
символы, чтобы препятствовать тому, чтобы они были интерпретированы как таковые.
Иначе использует Perl вместо sed
, передача переменной непосредственно к Perl, который обработает специальные символы в заменяющее время ($
символов, которые будут рассматривать буквально, нужно оставить даже если с помощью одинарных кавычек с этим методом):
sudo perl -i -spe 's/\$sUrl . \$this_sOutDir/https:\/\/$bucketname.s3.amazonaws.com . \$this->_sOutDir/g' -- -bucketname="$bucketname"
$ echo '$sUrl . $this_sOutDir' | perl -spe 's/\$sUrl . \$this_sOutDir/https:\/\/$bucketname.s3.amazonaws.com . \$this->_sOutDir/g' -- -bucketname="string/with/separators/&/and/accidental\$1backreferences"
https://string/with/separators/&/and/accidental$1backreferences.s3.amazonaws.com . $this->_sOutDir