Altera uma linha específica usando sed

2

Eu preciso alterar uma linha em um arquivo Java chamado DbConnection.java usando o comando sed . A linha é:

connection = DriverManager.getConnection("jdbc:mysql://**localhost**/**bajaj**","**root**", "**root**");

Eu tentei o abaixo, que funciona bem (eu posso substituir o valor fornecido pelo usuário):

sed -i "s|://localhost/bajaj|://${HOSTNAME}/${DBNAME}|" DbConnection.java

Mas o abaixo eu preciso começar a trabalhar, não posso substituir o DBUSERNAME & DBPASSWORD :

sed -i "s|"jdbc:mysql://localhost/bajaj","root", "root"|"jdbc:mysql://${HOSTNAME}/${DBNAME}","${DBUSERNAME}", "${DBPASSWORD}"|" DbConnection.java
    
por Ramesh G 01.07.2014 / 08:31

1 resposta

5

Você está usando aspas duplas para delimitar a string, bem como a própria string, então a string entre aspas para de início e os caracteres internos de aspas não são incluídos:

sed -i "s|"jdbc:mysql:...
Ends here-^

Você pode escapar de cada uma das citações dentro da string:

sed -i "s|\"jdbc:mysql://localhost/bajaj\",\"root\", \"root\"|\"jdbc:mysql://${HOSTNAME}/${DBNAME}\",\"${DBUSERNAME}\", \"${DBPASSWORD}\"|" DbConnection.java

Agora, cada aspas duplas dentro do comando sed tem uma barra invertida antes dele, para impedir que o shell o interprete.

Como alternativa, você pode usar aspas simples ao redor do argumento sed :

sed -i 's|"jdbc:mysql://localhost/bajaj","root", "root"|"jdbc:mysql://'"${HOSTNAME}"'/'"${DBNAME}"'","'"${DBUSERNAME}"'", "'"${DBPASSWORD}"'"|' DbConnection.java

Para que as variáveis ainda sejam substituídas, deixamos uma cotação única em torno de cada variável: 'AB'"$VAR"'CD' . Citamos duas vezes as variáveis no shell para impedir que elas sejam expandidas em várias palavras.

    
por 01.07.2014 / 09:02