如何将子字符串插入文本文件中的一行

如何将子字符串插入文本文件中的一行

我有很多 C++ 文件,其中有一些像这样的行:

CONST1( var1, var2, var3, var4 );

CONST1是一个我知道的常量,但var1tovar4是变量并且可以为空""。我想自动向所有这些行插入一个子字符串,如下所示:

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

由于它是 C++,因此可以存在或不存在空格。

我已准备好使用sedawkgrep或其他工具。我尝试使用 sed 和 regexp 但找不到方法。你有什么窍门可以教我吗?

答案1

基于逗号分隔符的简单解决方案 - 始终为 4 个变量:

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

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

带变量:

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 );

答案2

我认为这可以用 awk 来完成:

awk -f edit_my_c.awk data_file

来源编辑_my_c.awk

BEGIN {FS=","}

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

{print}

如果您想从命令行传递 CONST1 和 NEWSUB:

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

来源编辑_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}

相关内容