Bash localizar e substituir em um arquivo C ++

1

Eu tenho um script C ++ para o qual gostaria de alterar os valores das variáveis em alguns lugares e, em seguida, compilar, fazendo isso muitas vezes para um conjunto de números. O seguinte mostra meu script de shell:

#!/bin/bash

Rpl_array="30 60 90 120 150 180 210 240 270 300 330 360 390 420 450 480 510 540 570 600 630 660 690 720 750 780 810 840 870 900 930 960 1000"
parent_directory="execs_convergence_testing_corrected_robin_condition/phi_0/"
for rpl in ${Rpl_array}; do
        sed -ie "s/R_pl_initial=30.0/R_pl_initial="${rpl}"/g" iron_ablation_phi_nonzero_checking.cpp
        sed -ie "s/Rpl_30/Rpl_"${rpl}"/g" iron_ablation_phi_nonzero_checking.cpp
        g++ -std=c++0x iron_ablation_phi_nonzero_checking.cpp -o ${parent_directory}/Rpl_${rpl}.exe
    done

Como pode ser visto, eu uso sed duas vezes para tentar primeiro substituir um valor de variável e depois alterar uma string. Eu então compilo para a mudança, subseqüentemente correndo sobre todos os valores em rpl. No entanto, esse código não funciona para mim. Eu me pergunto o que posso estar fazendo errado.

    
por user4437416 19.04.2016 / 18:15

2 respostas

3

Da maneira que você escreveu o script, as alterações são feitas no arquivo de origem principal do C ++; Assim, na primeira vez que ele for executado, você substitui 30.0 por 30, e na segunda vez que ele é executado, o primeiro sed não encontrará nada para substituir ...

O seguinte deve funcionar (também corrigindo o problema de citação):

#!/bin/bash

Rpl_array="30 60 90 120 150 180 210 240 270 300 330 360 390 420 450 480 510 540 570 600 630 660 690 720 750 780 810 840 870 900 930 960 1000"
parent_directory="execs_convergence_testing_corrected_robin_condition/phi_0/"
for rpl in ${Rpl_array}; do
    sed -ie "s/R_pl_initial=30.0/R_pl_initial=${rpl}/g" iron_ablation_phi_nonzero_checking.cpp
    sed -ie "s/Rpl_30/Rpl_${rpl}/g" iron_ablation_phi_nonzero_checking.cpp
    g++ -std=c++0x iron_ablation_phi_nonzero_checking.cpp -o ${parent_directory}/Rpl_${rpl}.exe
    sed -ie "s/R_pl_initial=${rpl}/R_pl_initial=30.0/g" iron_ablation_phi_nonzero_checking.cpp
    sed -ie "s/Rpl_${rpl}/Rpl_30/g" iron_ablation_phi_nonzero_checking.cpp
done

Existem outras maneiras de fazer isso; você poderia usar um arquivo C ++ temporário e compilá-lo.

    
por 19.04.2016 / 18:31
1

Você deseja modificar o arquivo iron_ablation_phi_nonzero_checking.cpp em cada iteração do loop, mas seus comandos sed substituem os valores iniciais de algumas variáveis por novos valores. Isso funciona apenas para a primeira iteração; quando você insere a segunda iteração do loop, o arquivo já contém o resultado da primeira substituição, em vez do valor inicial e, portanto, os comandos sed falham.

    
por 19.04.2016 / 18:30