Como inserir uma substring em uma linha em um arquivo de texto

0

Eu tenho muitos arquivos C ++, que possuem algumas linhas como esta:

CONST1( var1, var2, var3, var4 );

CONST1 é uma constante que eu conheço, mas var1 to var4 são variáveis e podem estar vazias "" . Eu gostaria de inserir automaticamente uma substring para todas essas linhas como esta:

CONST1( var1, var2, var3, NEWSUBSTRING, var4 );

Os espaços podem estar presentes ou ausentes, pois é o C ++.

Estou pronto para usar sed , awk , grep ou outras ferramentas. Eu tentei com sed com regexp mas não consegui encontrar o caminho. Você tem um truque para me dar?

    
por dom_beau 18.01.2017 / 22:19

2 respostas

0

Solução simples baseada em delimitador de vírgula - sempre 4 vars:

gv@debian:$ a="CONST1( var1, var2, var3, var4 );";echo $a |awk -F',' '{print $1","$2","$3"," " substring" ","$4}'

CONST1( var1, var2, var3, substring, var4 );

Com variável:

gv@debian:$ a="CONST1( var1, var2, var3, var4 );";b="somestring";echo $a |awk -v x=$b -F',' '{print $1","$2","$3", "x","$4}'

CONST1( var1, var2, var3, somestring, var4 );
    
por 18.01.2017 / 23:49
0

Acho que isso pode ser feito com o awk:

awk -f edit_my_c.awk data_file

fonte para edit_my_c.awk :

BEGIN {FS=","}

/CONST1\(.*,.*,.*,.*\);/ {
    printf("%s, %s, %s, NEWSUBSTRING, %s\n", $1, $2, $3, $4);
    next;
}

{print}

E se você preferir passar o CONST1 e o NEWSUB da linha de comando:

awk -f ./edit_my_c2.awk -v to_match=CONST1 to_insert=NEWSUB data_file

fonte para edit_my_c2.awk :

BEGIN {
    FS=",";
    my_match=to_match "\(.*,.*,.*,.*\);";
}

$0 ~ my_match {
    printf("%s, %s, %s, %s, %s\n", $1, $2, $3, to_insert, $4);
    next;
}

{print}
    
por 18.01.2017 / 22:55