从 grep 搜索中省略包含“//”的结果

从 grep 搜索中省略包含“//”的结果

我正在尝试在大量 C++ 代码库中搜索将文本输出到我想要抑制的终端的单行。我已经查找std::cout并返回了大约 40 个不同的文件。我面临的问题是:

  • 我自己没有添加这个,所以我不知道它在哪里。
  • 它是一个仅输出内存位置的指针,因此我没有上下文来搜索它。
  • 代码库非常庞大,包含许多其他实例,sdt::cout这些实例曾经用于调试目的,但后来被注释掉了。

我的问题与最后一个有关。我在用

grep -rle 'std::cout' .

std::cout进行搜索,对于、以及任何其他位于实际注释掉的行上的情况//std::cout,它将返回正值。// std::coutstd::cout

如何修改 mygrep以省略任何包含的行//,以便消除注释行?

答案1

std::cout仅当其前面没有 时,您才可以查找//。正则表达式语法不包含否定;每个正则表达式都可以通过写出其补码来求反,但补码可能会变得很大。在这里,它不是太大:

grep -rl -E '^/?([^/]/?)*std::cout' .

您还可以列出所有出现的std::cout并过滤掉出现的//.*std::cout,但请注意,这将隐藏诸如 之类的内容std::cout << foo; // std::cout << bar;

grep -r 'std::cout' . | grep -vE '^[^:]*:.*//.*std::cout' | sed -e 's/:.*//'

或者,您可以运行解析 C++ 代码的工具,例如标签

答案2

egrep -r '^([^/]/?)*std::cout' .

答案3

grep -r 'std::cout' . | grep -v '^[ \t]*//'

只会忽略被注释掉的行,而不是所有有注释的行。

答案4

补充吉尔斯的回答,对于单个文件你可以在 Sed 中更简单地完成整个事情:

sed -n 'h;s|//.*||;/std::cout/{g;p;}' file.c

换句话说,只需保存(h旧)该行,删除任何尾随注释,然后如果该行与您想要的模式匹配,g则设置该行的保存副本并打印它。

不过,对于递归 grep,请使用 Gille 的解决方案。

相关内容