Bash 在 C++ 文件中查找和替换

Bash 在 C++ 文件中查找和替换

我有一个 C++ 脚本,我想在某些地方更改变量值,然后编译,对一组数字执行多次。下面显示了我的 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

可以看出,我使用了sed 两次来尝试首先替换变量值,然后更改字符串。然后我针对更改进行编译,随后运行 rpl 中的所有值。但是,这段代码对我不起作用。我想知道我可能做错了什么。

答案1

按照您编写脚本的方式,对主 C++ 源文件进行了更改;因此,第一次运行时,您将 30.0 替换为 30,第二次运行时,第一次sed将找不到任何可替换的内容...

以下应该有效(也解决了引用问题):

#!/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

还有其他方法可以解决这个问题;您可以使用临时 C++ 文件并对其进行编译。

答案2

您想要iron_ablation_phi_nonzero_checking.cpp在循环的每次迭代中修改该文件,但是您的sed命令替换了最初的一些变量的值由新值决定。这仅适用于第一次迭代;当您进入循环的第二次迭代时,文件已包含第一次替换的结果,而不是初始值,因此命令sed失败。

相关内容