Substituindo configurações do mysql por sed

1

Estou criando um servidor da Web de backup, mas quero que o servidor de backup tenha apenas um usuário raiz. Então, depois de mover todos os bancos de dados, eu preciso substituir todas as linhas mysqli_connect(...) em db.txt .

Eu escrevi:

beg="mysqli_connect("
end=");"
#need to find out the database
db="123"
new="'localhost','root','pass','$db'"

cat db.txt | sed "s/$beg.*$end/$beg$new$end/"

para substituir todas as configurações, mas preciso descobrir o banco de dados. Eu posso fazer isso obtendo o texto entre o $end e o anterior ' , ', mas como eu poderia conseguir isso com sed?

entrada:

Arquivo em potencial:

sadnkjnadsjknfaskdjfnlasdnfkdsa
safdjnasdkjjfasndka
asfdknjdsakjfnasjdnkfsadnjkads mysqli_connect("192.168.1.10","dave","password","DavesDB");
sdfnjnweewrewqrfgjdgnf
vncnccnvxjncvjn4wrwerewrewerwjvcnxjnvcj
mysqli_connect("192.168.1.10" , "tom" , "password" , 'TomsDB'); dsanjasdknfjansd
sakfdnjsadjkfnsa
sknfdsjdnfjsdnnqwerweq

saída:

sadnkjnadsjknfaskdjfnlasdnfkdsa
safdjnasdkjjfasndka
asfdknjdsakjfnasjdnkfsadnjkads mysqli_connect("localhost","root","rootpassword","DavesDB");
sdfnjnweewrewqrfgjdgnf
vncnccnvxjncvjn4wrwerewrewerwjvcnxjnvcj
mysqli_connect("localhost","root","rootpassword","TomsDB"); dsanjasdknfjansd
sakfdnjsadjkfnsa
sknfdsjdnfjsdnnqwerweq
    
por maxisme 16.05.2016 / 12:22

1 resposta

1

Você não precisa obter o nome do banco de dados, não faz sentido substituir algo por si mesmo. Apenas deixe inalterado:

beg="mysqli_connect("
new="'localhost','root','pass',"
sed "s/$beg\([^,]\+,\)\{3\}/$beg$new/" file 

Se eu salvar o exemplo que você deu como file , isso retorna:

$ sed "s/$beg\([^,]\+,\)\{3\}/$beg$new/" file 
sadnkjnadsjknfaskdjfnlasdnfkdsa
safdjnasdkjjfasndka
asfdknjdsakjfnasjdnkfsadnjkads mysqli_connect('localhost','root','pass',"DavesDB");
sdfnjnweewrewqrfgjdgnf
vncnccnvxjncvjn4wrwerewrewerwjvcnxjnvcj
mysqli_connect('localhost','root','pass', 'TomsDB'); dsanjasdknfjansd
sakfdnjsadjkfnsa
sknfdsjdnfjsdnnqwerweq

A expressão regular sed procura $beg , depois três instâncias de não , seguidas por uma vírgula ( \([^,]\+,\)\{3\} ) e substitui-as por $beg$new . O nome do banco de dados é deixado como está, já que não há razão para alterá-lo.

Você também pode simplificar um pouco a sintaxe removendo ( de $beg , o que permite usar a sintaxe de regex estendida do sed:

$ sed -E "s/$beg\(([^,]+,){3}/$beg($new/" file 
sadnkjnadsjknfaskdjfnlasdnfkdsa
safdjnasdkjjfasndka
asfdknjdsakjfnasjdnkfsadnjkads mysqli_connect('localhost','root','pass',"DavesDB");
sdfnjnweewrewqrfgjdgnf
vncnccnvxjncvjn4wrwerewrewerwjvcnxjnvcj
mysqli_connect('localhost','root','pass', 'TomsDB'); dsanjasdknfjansd
sakfdnjsadjkfnsa
sknfdsjdnfjsdnnqwerweq
    
por 16.05.2016 / 13:44