我有很多 C++ 文件,其中有一些像这样的行:
CONST1( var1, var2, var3, var4 );
CONST1
是一个我知道的常量,但var1
tovar4
是变量并且可以为空""
。我想自动向所有这些行插入一个子字符串,如下所示:
CONST1( var1, var2, var3, NEWSUBSTRING, var4 );
由于它是 C++,因此可以存在或不存在空格。
我已准备好使用sed
、awk
、grep
或其他工具。我尝试使用 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}