【问题标题】:How to replace the whole argument part of a C function call?如何替换 C 函数调用的整个参数部分?
【发布时间】:2014-11-18 14:26:39
【问题描述】:

我正在编写一个 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 的正则表达式(或任何其他命令),即无论括号级别的数量如何,都可以准确地获取正确级别括号的内容?

【问题讨论】:

标签: regex bash replace sed parentheses


【解决方案1】:

如果您确定您的行将只包含 myfunc( foo ) 并且之后没有更多的 ),您可以像这样进行贪婪搜索:

myfunc\((.*)\)

查看示例:http://regex101.com/r/gD1mN0/1

【讨论】:

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

解释

  • myfunc( 之后的() 的任何对等点分别替换为²³。 (使用递归调用来替换每个较低级别的较低级别)。在最后一次替换之后,您会得到类似 myfunc( subfunc2² subfunc3² arg31, arg32³, arg22³) 的内容
  • () 之间的内容,其中没有更多的( )(哎呀,在这种情况下,字符串中仍然可能有( ) 如此错误)并替换为content, content + 1
  • 将任何²³分别重置为()

备注:myfunc() 内的字符串中的任何 () 都需要进行第一轮更改(操作结束时临时修改为原始状态)[不是很难做到,但很烦人]

【讨论】:

  • 感谢您的回答。能否简单介绍一下该命令的机制?
  • 瞧,添加到帖子中(发现了一个限制)
猜你喜欢
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多