Como eu uso variáveis e não variáveis em um único comando sed?

2

Estou tentando usar sed para substituir algumas linhas do PHP.

Meu problema é que eu quero substituir uma linha com variáveis PHP por uma string incluindo uma variável Bash.

Aqui está um exemplo:

sudo sed -i 's/$sUrl . $this_sOutDir/https:\/\/'$bucketname'.s3.amazonaws.com . $this->_sOutDir/g' /var/www/html/$name/core/oxconfig.php

Como você pode ver, eu quero substituir $sUrl . $this->_sOutDir (literalmente) pela URL s3, que inclui uma variável Bash. Estou tentando usar aspas duplas, mas não está funcionando para mim:

 sudo sed -i 's/$sUrl . $this_sOutDir/https:\/\/"$bucketname".s3.amazonaws.com . $this->_sOutDir/g' /var/www/html/$name/core/oxconfig.php

Eu também estou tentando usar o s/... completo entre aspas duplas, mas não está funcionando porque sed acha que as primeiras variáveis também são variáveis Bash.

O resultado é:

return https://.s3.amazonaws.com . $this->_sOutDir . '/';
    
por Peter Franke 08.04.2016 / 17:01

1 resposta

0

Você pode seguir duas formas diferentes:

  1. Usando aspas simples: rompa as aspas simples e faça referência à variável (usando aspas duplas para impedir a divisão de palavras e a expansão de nomes de arquivos):

    sudo sed -i 's/$sUrl . $this_sOutDir/https:\/\/'"$bucketname"'.s3.amazonaws.com . $this->_sOutDir/g' /var/www/html/$name/core/oxconfig.php
    
  2. Usando aspas duplas: escape os caracteres $ a serem tratados literalmente:

    sudo sed -i "s/$sUrl . $this_sOutDir/https:\/\/$bucketname.s3.amazonaws.com . $this->_sOutDir/g' /var/www/html/$name/core/oxconfig.php
    

No entanto , a ressalva é: se $bucketname contiver sed caracteres especiais / seqüências, o comando sed será interrompido (nesse caso, já que a variável deve ser expandida na substituição seção, a preocupação é sobre isso, possivelmente, contendo o separador, backreferences acidental ou & .

Uma maneira de contornar isso é sanear a variável antecipadamente, evitando possíveis separadores, referências anteriores acidentais e & caracteres para evitar que eles sejam interpretados como tal.

Outra maneira é usar Perl em vez de sed , passando a variável diretamente para Perl, que manipulará caracteres especiais no momento da substituição ( $ caracteres a serem tratados literalmente devem ter escape mesmo se usar aspas simples com esse método):

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/accidentalbackreferences.s3.amazonaws.com . $this->_sOutDir
    
por kos 08.04.2016 / 17:35