我正在尝试在大量 C++ 代码库中搜索将文本输出到我想要抑制的终端的单行。我已经查找std::cout
并返回了大约 40 个不同的文件。我面临的问题是:
- 我自己没有添加这个,所以我不知道它在哪里。
- 它是一个仅输出内存位置的指针,因此我没有上下文来搜索它。
- 代码库非常庞大,包含许多其他实例,
sdt::cout
这些实例曾经用于调试目的,但后来被注释掉了。
我的问题与最后一个有关。我在用
grep -rle 'std::cout' .
std::cout
进行搜索,对于、以及任何其他位于实际注释掉的行上的情况//std::cout
,它将返回正值。// std::cout
std::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 的解决方案。