Como usar o sed em um loop para inserir valores de variáveis?

0

Então, eu estou tentando fazer isso para praticar apenas para obter um entendimento, mas se eu tiver um código em dizer test.cpp e eu quiser mudar uma linha no programa diga "CONST N = 10" que altera o valor de N para valores diferentes através de um loop em um script bash como eu faria isso? Meu palpite inicial era fazer:

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

onde x seria executado através de 10 e 20 e, em seguida, inserir esses valores no valor da variável no programa ... Mas não tenho certeza se é isso que eu deveria estar fazendo ou não. Qualquer ajuda seria muito apreciada.

    
por Robert 21.03.2018 / 17:39

2 respostas

1

Uma maneira melhor seria usar uma macro de pré-processamento, que você pode definir na linha de compilação. Então mude o código para:

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

e, em seguida, compile com:

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

O bloco $ifndef fornece um padrão quando você não usa -DN_MAC para substituí-lo.

    
por 21.03.2018 / 23:39
0

O loop que você tem parece que deveria funcionar, recompilaria o programa para os valores de N igual a 10 e 20 .

No entanto.

1) Se você quiser todos os 11 valores entre 10 e 20, terá que usar algo como for x in {10..20} ou for ((x = 10 ; x <= 20 ; x++)) .

2) Mudar o código-fonte duas vezes parece um pouco inútil, pode ser mais limpo manter uma versão base que não muda, a qual você modifica conforme necessário, por exemplo,

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

ou mesmo algo como sed -Ee 's/^(const int N =)[^;]*;/ '"$x"';/g' para ignorar completamente o valor na atribuição.

3) Não use test.o para o arquivo executável. A extensão .o sugere um arquivo de objeto, o que você obteria executando gcc -c test.c . Além disso, neste caso, x contém apenas números, mas apenas para estar no lado seguro, é melhor citá-lo duas vezes, como acima.

Dito isto, modificar o programa para ler o número fora da linha de comando em vez de recompilar para cada valor não seria muito difícil. Isso atribuiria o primeiro argumento a N e depois imprimi-lo (está em C, mas, até onde eu sei, os argumentos para main funcionam de maneira semelhante em 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;
}
    
por 21.03.2018 / 23:43