如何替换C函数调用的整个参数部分?

时间:2014-09-24 07:30:33

标签: regex bash replace sed parentheses

我正在编写一个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的正则表达式(或任何其他命令),即正确的括号级别的内容,无论括号级别的数量是多少?

2 个答案:

答案 0 :(得分:1)

如果您确定自己的专栏只会包含myfunc( foo )且之后不再有),那么您可以执行以下贪婪搜索:

myfunc\((.*)\)

参见示例:http://regex101.com/r/gD1mN0/1

答案 1 :(得分:1)

sed ':a
s/myfunc(\([^(]\)(\([^)]*\))/myfunc(\1²\2³/
ta
s/myfunc(\([^)]*\))/myfunc(\1, (\1) + 1 )/g
y/²³/()/
'
  • 尝试这个,但它会在第二个myfunc(通常很少使用)上的递归调用(myfunc( 1 - myfunc( 2) ))上失败(按原样)但是会在行上的几个myfunc(非包含)上工作。
  • 假设打开和关闭()myfunc位于同一行(默认情况下,每行工作一行)
  • posix版本(GNU sed上的--posix
  • 使用标记²³,因此假设未在代码中使用,如果有任何使用其他未使用的字符或预先修改并在之后将其放回。

<强>的解释

  • 分别() myfunc(之后替换²³的所有同行。 (使用递归调用替换每个较低级别的较低级别)。在最后一次替换之后,你有myfunc( subfunc2² subfunc3² arg31, arg32³, arg22³)
  • 之类的东西
  • ()之间的内容置于( )之内(oops,仍然可以在字符串中设置( )以便在该情况下使用错误)并替换为content, content + 1
  • 将所有²³重置为repsectively ()

备注:(内的字符串中的任何)myfunc()都需要进行第一轮更改(在操作结束时返回原始版本进行临时修改)很难做但讨厌]