如何在循环中使用sed输入变量值?

如何在循环中使用sed输入变量值?

因此,我尝试这样做是为了练习,只是为了获得理解,但是如果我在 test.cpp 中有一段代码,并且我想更改程序中的一行,例如“CONST N = 10”,它将 N 的值更改为不同的值通过 bash 脚本中的循环获取值我该怎么做?我最初的猜测是:

for x in 10 20
 do 
    sed -i -e 's/const int N = 10;/const int N = '$x';/g' test.cpp
    g++ test.cpp -o test.o
    ./test.o
    sed -i -e 's/const int N = '$x';/const int N = 10;/g' test.cpp
 done

其中 x 将运行 10 和 20,然后将这些值输入到程序中的变量值中...但我不确定这是否是我应该做的。任何帮助将不胜感激。

答案1

更好的方法是使用预处理器宏,您可以在编译行中定义它。因此将代码更改为:

#ifndef N_MAC
#define N_MAC 10
#endif
const int N = N_MAC;

然后用以下命令编译它:

g++ test.cpp -DN_MAC=$x -o test.o

$ifndef当您不使用-DN_MAC覆盖它时,该块会提供默认值。

答案2

您的循环似乎应该可以工作,它将重新编译程序以获得N等于10和的值20

然而。

1) 如果您想要 10 到 20 之间的所有 11 个值,则必须使用类似for x in {10..20}for ((x = 10 ; x <= 20 ; x++))之类的东西。

2)两次更改源代码似乎有点无用,保留一个不变的基本版本然后根据需要进行修改可能会更干净,例如

sed -e 's/const int N = 10;/const int N = '"$x"';/g' base.cpp > test.cpp
g++ -Wall test.cpp -o test
./test
rm test.cpp test

或者甚至sed -Ee 's/^(const int N =)[^;]*;/\1 '"$x"';/g'完全忽略赋值中的值。

3) 不要用于test.o可执行文件。扩展.o名暗示了一个目标文件,您可以通过运行 gcc -c test.c.另外,在这种情况下x仅包含数字,但为了安全起见,最好将其双引号,如上所述。


也就是说,修改程序以从命令行读取数字而不是为每个值重新编译不会太困难。这会将第一个参数分配给N然后打印它(它是用 C 语言编写的,但据我所知,这些参数main在 C++ 中的工作方式类似):

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int N = 10;
    if (argc > 1) N = atoi(argv[1]);
    printf("N: %d\n", N);
    return 0;
}

相关内容