我正在编写一个bash脚本,旨在影响文件夹中的所有文件,以便通过更改参数来替换对给定C函数的所有调用。 这是当前调用的样子,以及我想要获得的内容:
myfunc( foo ) ----> myfunc( foo, foo+1 )
我使用以下find / sed命令完成工作:
find . -name "*" -print | xargs sed -i 's/myfunc\([^)]*)\)/myfunc((\1),(\1)+1)/g'
但是当我必须处理包含括号的指令/参数时,就会出现问题,如下面的说明所示:
sqrt( myfunc( (foo+foo)*bar ) );
第一个右括号(即foo
之后的一个)被解释为myfunc
参数的结尾,它不是......
如何获取捕获和替换(foo+foo)*bar
的正则表达式(或任何其他命令),即正确的括号级别的内容,无论括号级别的数量是多少?
答案 0 :(得分:1)
如果您确定自己的专栏只会包含myfunc( foo )
且之后不再有)
,那么您可以执行以下贪婪搜索:
myfunc\((.*)\)
答案 1 :(得分:1)
sed ':a
s/myfunc(\([^(]\)(\([^)]*\))/myfunc(\1²\2³/
ta
s/myfunc(\([^)]*\))/myfunc(\1, (\1) + 1 )/g
y/²³/()/
'
myfunc( 1 - myfunc( 2) )
)上失败(按原样)但是会在行上的几个myfunc(非包含)上工作。()
与myfunc
位于同一行(默认情况下,每行工作一行)--posix
)²³
,因此假设未在代码中使用,如果有任何使用其他未使用的字符或预先修改并在之后将其放回。<强>的解释强>
()
myfunc(
之后替换²³
的所有同行。 (使用递归调用替换每个较低级别的较低级别)。在最后一次替换之后,你有myfunc( subfunc2² subfunc3² arg31, arg32³, arg22³)
()
之间的内容置于( )
之内(oops,仍然可以在字符串中设置( )
以便在该情况下使用错误)并替换为content, content + 1
²³
重置为repsectively ()
备注:(
内的字符串中的任何)
或myfunc()
都需要进行第一轮更改(在操作结束时返回原始版本进行临时修改)很难做但讨厌]