Não é possível substituir o texto usando sed

0

Estou escrevendo um script e parte dele envolve a substituição de alguns parâmetros em um arquivo.

Estou tentando encontrar e substituir o parâmetro e preciso depurar o sed.

sed -i "s/"$DEFAULT_MAIL_DOMAIN = "padl.com";"/"$DEFAULT_MAIL_DOMAIN = "$E_DOMAIN";"/g" /usr/share/migrationtools/migrate_common.ph

Arquivo de destino:

# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "padl.com";

# Default base 
$DEFAULT_BASE = "dc=padl,dc=com"

Script:

echo "Enter the email domain"
read E_DOMAIN
echo "The email domain will be "$E_DOMAIN".com"
sleep 2
E_DOMAIN_VAR=$E_DOMAIN.com
sed -i "s/"$DEFAULT_MAIL_DOMAIN = "padl.com";"/"$DEFAULT_MAIL_DOMAIN = "$E_DOMAIN";"/g" /usr/share/migrationtools/migrate_common.ph
    
por Atul 03.05.2017 / 17:38

2 respostas

4

Eu recomendaria algo mais parecido com o seguinte:

sed -i 's|$DEFAULT_MAIL_DOMAIN = \"padl.com\";|$DEFAULT_MAIL_DOMAIN = \"$E_DOMAIN\";|' /usr/share/migrationtools/migrate_common.ph

Alterações que fiz:

  • mudou para aspas simples ao redor da substituição do sed. Todas aquelas citações duplas que você estava fazendo estavam fadadas a causar problemas.
  • Alterado de / para | para a sintaxe de substituição de sed. Esta parte não é necessária. Eu apenas prefiro isso. Você pode manter / , se quiser.
  • Em seguida, removi as aspas duplas em torno dos textos de pesquisa e de substituição. Não havia necessidade deles.
  • Escapou as aspas duplas que estão, na verdade, no texto do arquivo.
  • removeu o sinalizador global no final da substituição do sed. Isso parece um parâmetro em um arquivo de configuração, só vai acontecer uma vez por linha (e provavelmente uma vez por arquivo).
por 03.05.2017 / 17:56
2

Se $DEFAULT_MAIL_DOMAIN e as aspas forem uma parte literal do arquivo, precisamos usar aspas simples ou barras invertidas para escapar delas. Então, qualquer um dos seguintes:

$ E_DOMAIN=foobar.com
$ sed -e 's/$DEFAULT_MAIL_DOMAIN = "padl.com"/$DEFAULT_MAIL_DOMAIN = "'"$E_DOMAIN"'"/' file
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "foobar.com";
...
$ sed -e "s/\$DEFAULT_MAIL_DOMAIN = \"padl.com\"/\$DEFAULT_MAIL_DOMAIN = \"$E_DOMAIN\"/" file
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "foobar.com";

No primeiro, as aspas são interpretadas assim:

'.../$DEFAULT_MAIL_DOMAIN = "'"$E_DOMAIN"'"/'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^           ^^^^  - single-quoted, literal ""s
                              ^^^^^^^^^^^  - double-quoted, var expanded

No segundo, a coisa toda é uma sequência de aspas duplas, com a problemática $ e " escapou. Mas não o $ em $E_DOMAIN , pois queremos expandir essa variável.

Não tenho certeza se a variável deve ser E_DOMAIN ou E_DOMAIN_VAR , você adicionou o sufixo .com a este último, mas usou o primeiro no comando sed . Em qualquer caso, / , & ou nova linha na variável serão processados especialmente por sed , mas um nome de domínio não deve conter esses.

No seu trecho, o texto está um pouco errado:

sed -i "s/"$DEFAULT_MAIL_DOMAIN = "padl.com";"/"$DEFAULT_MAIL_DOMAIN = "$E_DOMAIN";"/g" 

A primeira parte "s/" é uma string entre aspas, então $DEFAULT_MAIL_DOMAIN está fora de aspas, então é expandida como uma variável (provavelmente para uma string vazia). Os espaços também não são citados, então sed recebe vários argumentos e provavelmente irá reclamar. "padl.com" é novamente citado, mas o ponto-e-vírgula não é, portanto, o shell o interpretará como finalizando o comando.

    
por 03.05.2017 / 19:23

Tags