我有几个包含以下行的源代码文件(.cpp):
other stuff
...
TRACE(arg1, arg2, ...);
...
other stuff
其中arg1,arg2,...表示由逗号分隔的任意函数调用参数,可能前面有空格。
目标是解析项目中每个源文件中的每一行,并从函数调用TRACE中删除第一个参数(arg1),例如
TRACE(arg2, arg3, ...);
请注意,函数TRACE前面可以有任意数量的空格,并且本身可以包含字符串TRACE,例如
TRACE(0, TRACE_INFO, "Test ");
TRACE( 0 , TRACE, 4,5 ,6);
有一种简单的方法吗?
测试文件test.cpp包含:
TRACE( "I2Ccontrol::I2Ccontrol", TRACE_FATAL,0);
3个空格,没有前面的行没有后续行
答案 0 :(得分:3)
将sed与扩展正则表达式一起使用:
sed -r 's/(\bTRACE\()([^",]+,\s*|\s*"[^"]*"\s*,\s*)(.*\);)/\1\3/' file
要使用sed --in-place -r ...
编辑:
测试来自评论的输入:
echo ' TRACE( "I2Ccontrol::I2Ccontrol", TRACE_FATAL,0);' |sed -r 's/(\bTRACE\()([^",]+,\s*|\s*"[^"]*"\s*,\s*)(.*\);)/\1\3/'
#three white space before TRACE
输出:
TRACE(TRACE_FATAL,0);