ループでsedを使用して変数値を入力するには?

ループでsedを使用して変数値を入力するには?

したがって、理解を助けるために練習用にこれを実行しようとしています。しかし、test.cppにコードスニペットがあり、プログラムで「CONST N = 10」のように1行を変更したい場合は変更されます。 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

あなたのループは正常に動作しているように見え、プログラムを再コンパイルしてsumNと同じ値を取得します。1020

しかし。

1)10から20の間の11個の値がすべて必要な場合、または同じものを使用する必要がありますfor x in {10..20}for ((x = 10 ; x <= 20 ; x++))

2)ソースコードを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.cx


つまり、各値を再コンパイルするのではなく、コマンドラインから数字を読み取るようにプログラムを変更することはそれほど難しくありません。これは最初の引数を割り当ててN印刷します(Cで書かれていますが、引数はmainC ++でも同様に機能します)。

#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;
}

関連情報