问题:在大型项目中使用ack查找打印线

所以我有一个非常大的项目,它在运行时打印一个基本上是这样的数据集:

x,y,z,?,?

我想找到打印的位置,以便我可以删除它。

我已经为 std::cout 尝试了 ack-grep,但是文件太多了。有谁知道如何在一行中搜索 std::cout 和 4 个逗号(即我知道 std::cout 和 4 个逗号会出现在该行中,但我不确定还有什么)。我想也许会有一些正则表达式用于此,如 find std::cout 和 "," 但其中四个。

有任何想法吗?

解答

非常同意的方法

ack 'cout.+(.+,){4,}' --cpp

注意是.+不是.*,因为.*会匹配一个空字符串,所以,,,,会匹配。你想确保逗号之间有一些东西。我还添加了--cpp标志,以便它只选择 C++ 文件进行搜索。


现在,您说您想删除匹配的每一行,因此您可以通过以下方式扩展此解决方案来做到这一点。当然,您需要确保所有源代码都在版本控制中,或者至少有备份,以防出现问题。我无法确切地说出您的代码是什么样的。您必须检查代码是否适用于您的情况。

如果您发现 ack 找到的每一行都是您要删除的,您可以使用 Perl 删除这些行。您使用的正则表达式是相同的,因为 ack 在 Perl 中并使用 Perl 正则表达式。

ack -f --cpp | xargs perl -i -n -e'print unless /cout.+(.+){4,}/'

ack -f --cpp告诉 ack 生成树中所有 C++ 文件的列表,然后 xargs 重复调用该 Perl 命令行。 perl 的-i选项说“就地编辑文件”,-n告诉 Perl 循环输入文件,-e给出对每一行执行的命令。在这种情况下,我们告诉 Perl 打印它刚刚读取的任何行,除非它与该正则表达式匹配。这有效地从每个文件中删除了匹配的行。

Logo

Ubuntu 社区为您提供最前沿的新闻资讯和知识内容