Как использовать переменные и не переменные в одной команде sed?

Я пытаюсь использовать 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 . '/';
2
задан 8 April 2016 в 18:40

1 ответ

Можно пойти двумя различными путями:

  1. Используя одинарные кавычки: убегите из одинарных кавычек и сошлитесь на переменную (использующий двойные кавычки для предотвращения разделения слова и расширения имени файла):

    sudo sed -i 's/$sUrl . $this_sOutDir/https:\/\/'"$bucketname"'.s3.amazonaws.com . $this->_sOutDir/g' /var/www/html/$name/core/oxconfig.php
    
  2. Используя двойные кавычки: выйдите $ символы, которые будут рассматривать буквально:

    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
0
ответ дан 9 April 2016 в 04:40
  • 1
    Нет, я haven' t Mac Да, я знаю о " Super" ключ. Но в версии 16.04 должна быть другая команда. – invzbl3 18 August 2017 в 07:09

Другие вопросы по тегам:

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