寻找"主要"功能'通过Bash脚本在C文件中的名称

时间:2016-10-13 14:45:20

标签: c regex bash unix grep

我有大量的C文件,其结构遵循以下原则:

  • 所有函数都在C文件中声明,返回类型为int,double或void。
  • 所有功能均以" ksz _"开头。只有函数使用它 - 没有其他用途" ksz _"在他们的名字。
  • 该文件包含" main"功能。所有支持功能都使用他们的" main"功能的名称形成自己。
  • 因为它们是由不同的人制作的,所以制作得非常糟糕,并且随意放置空间:

一个可行的可视化将是(注意空格):

int ksz_Print(...)
{
...
}

void  ksz_Print_Helper1 (... ){
...
}
 void ksz_Print_Helper2(...) {
...
}
int ksz_Input(...){
...
}
double ksz_Input_Helper1  ( ...){
...
}

我需要找到" main"每个C文件的函数名称,以便将它们用于另一个搜索算法。 由于这些文件很大(它们的数量超过十几行)并且有数百个 - 我需要一个Bash脚本。

理想情况下,此脚本只会提取" main"功能:

ksz_Print
ksz_Input

阻止我的是我无法想到 grep 正则表达式以便提取功能线。我认为它的逻辑应该是这样的:

(spaces)(int / float / double)(spaces)(ksz _)(其他没有空格的characers)(空格)(open bracket)

之后我想我会提取包含" ksz _"来自 cut 的每一行(修剪并删除重复的空格后)。

最后,我需要找到一种方法来过滤掉支持功能。

但是这个剧本中我最初的grep是什么?

2 个答案:

答案 0 :(得分:0)

如果我理解你的规格,应该这样做:

root@local [~]# awk '/^[ \t]*(int|float|double)[ \t]+ksz_/ {print $2}' sample.txt

我不明白的一件事是在ksz之后是否应该只有一个“_”,例如,如果“double ksz_Input_Helper1”不是你想要匹配的东西。在上面的正则表达式中它确实匹配。

我还选择使用awk而不是grep,因为你说你只想要上面awk的名字,只使用空格作为分隔符打印第二个字段。如果你仍然想使用grep,那么这个任务就完成了:

root@local [~]# egrep '^\s*(int|float|double)\s+ksz_' sample.txt

这是一个细分(在awk中注意我使用[\ t]代替\ s,因为我无法识别\ s]:

^ - match start of line
\s* - match if there are 0 or more white spaces
(int|float|double) - match int, float, OR double
\s+ - match at least one whitespace
ksz_ - match literal string "ksz_"

答案 1 :(得分:0)

尝试使用仅匹配所需部分的正则表达式,并仅打印:

grep -oRE "(ksz_[a-zA-Z_]*\b)" *
   -o - output only match
   -R - recursive
   -E - regex
   [a-zA-Z_] - upper and lower case letters, underscore
   \b - ending at word boundry