如何在源代码上grep而不会引起注释


10

我搜索了一种在源代码上grep的方法,而不会因为注释而有时出现假阳性。例如,如果我在此.c源代码上搜索foo:

/* 
 * foo has changed [...] and is now a 2-parameters function
 */
// foo(24)
foo(42, 28);

天真的人grep会发现3次出现,而我只想要一次。我已经在StackOverflow上看到了这种方法,但是它不能满足我的需求:PHP在平台上不可用。我也发现这种方式用于单行注释,但这只能解决部分问题。

我需要使用经典脚本工具(awk,sed,bash,grep等),即使有成千上万个文件,我也要使其速度更快

您现在是否可以以及仅在源代码上grep的可能性以及如何实现?


3
建立标签表可能是一种更好的方法,具体取决于您在做什么。
吉勒斯(Gilles)'“ SO-不要邪恶”

Answers:


10

您可以尝试采用一种幼稚的方法来匹配非注释,如下所示:

 $ egrep -v "^(//|/\*| \*)" sourcecode

这将打击前缀评论仅供逆匹配-这是开始的行任一///***/-因此它会不会离开了与该注释掉块/**/对。


稍作修改以适用于缩进注释:$ egrep -v“ ^ [[:: space:]] *((// | / * | *)”源代码
mbonness

11

grep适用于纯文本,对C程序的基本语法一无所知。因此,为了不搜索内部注释,您可以选择以下几种方法:

  1. 在搜索之前删除C注释,您可以使用进行。gcc -fpreprocessed -dD -E yourfile.c有关详细信息,请参见/programming/2394017/remove-comments-from-cc-code

  2. 编写/使用一些像您已经发现的骇人的半工作脚本(例如,它们通过跳过以//或开头的行来工作/*),以便处理所有可能的C / C ++注释的细节(同样,请参见前面的链接中的一些令人恐惧的测试用例) 。这样一来,您仍然可能会有误报,但是您不必进行任何预处理。

  3. 使用更高级的工具在代码中执行“语义搜索”。我发现“ coccigrep”:http ://home.regit.org/software/coccigrep/ 这种工具允许搜索某些特定的语言语句(即,使用给定名称的结构的更新),并且肯定会删除注释。


1

对于我们这个问题的所有其他后来者,这是一个特定的变体:

ls -1 src/*.c | xargs -i sh -c "echo;gcc -fpreprocessed -dD -E {} 2>&1 | grep -wi -e one -e two -e three -n | sed 's:^:{}\::'" | cat -s

C源文件的列表

ls -1 src/*.c

被传递给xargs,xargs在子外壳中执行预处理器

gcc -fpreprocessed -dD -E {} 2>&1

随后将其通过管道传递给所需的grep命令

grep -wi -e one -e two -e three -n

然后将其通过管道传输到sed中,以在每行前面加上当前文件名

sed 's:^:{}\::'

最后,使用cat将所有重复的空白行折叠为单行:

cat -s

这适用于RHEL6系统,但我认为它对于其他* nix系统已经足够通用了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.