使用BASH和正则表达式按名称提取功能主体

时间:2019-02-18 11:35:38

标签: regex bash sed

我有一些MATLAB coder自动生成的代码。我想制作一个脚本来查找大文件中的条目。我已经成功地使用BASH遍历了正则表达式,以获取主要功能main\( *([^)]+?)\),然后通过/\{([^}]+)\}/获得了正文;但是,我在将它们粘合在一起时经历了可怕的时光。我需要的只是main()中包含的函数名称。

我意识到这可能是一个糟糕的练习,但是自动生成的代码为我提供了如下简单的功能:

int main(int argc, const char * const argv[])
{
  (void)argc;
  (void)argv;
  /* Initialize the application. You do not need to do this more than one time. */
  RT_initialize();
  /* Invoke the entry-point functions. You can call entry-point functions multiple times. */
  main_RT();
  /* Terminate the application.  You do not need to do this more than one time. */
  RT_terminate();
  return 0;
}

我想提取那个功能和主体,但是我的正则表达式比我记得的要差。

任何指导将不胜感激。

2 个答案:

答案 0 :(得分:3)

一种相当可靠地提取整个函数体的简单方法是先通过格式化程序运行代码:

indent -kr < mymain.c | sed -n 's/^int main(/,/^}/p'

cflow可以给您一个函数调用图。例如:

cflow -d2 mymain.c

答案 1 :(得分:0)

由于对BSD的某些限制,所产生的BASH函数将按照名称从C源获取函数体。仅使用MATLAB编码器中格式良好的C代码进行了测试。

function getFunctionInC(){
TMPFILEIDENT="/tmp/indent.$$.tmp" #temp file
indent "$1" $TMPFILEIDENT
cat $TMPFILEIDENT | awk '
BEGIN { state = 0; last = ""; }
    $0 ~ /^'$2'\(/ { print last; state = 1; }
        { if (state == 1) print; }
    $0 ~ /^}/ { if (state) state = 2; }
        { last = $0; }
'
}

输出中的格式很糟糕,但是我可以轻松提取函数名称以动态创建定义。感谢阅读问题的每个人。