在大型项目中使用ack查找打印线
问题:在大型项目中使用ack查找打印线 所以我有一个非常大的项目,它在运行时打印一个基本上是这样的数据集: x,y,z,?,? 我想找到打印的位置,以便我可以删除它。 我已经为 std::cout 尝试了 ack-grep,但是文件太多了。有谁知道如何在一行中搜索 std::cout 和 4 个逗号(即我知道 std::cout 和 4 个逗号会出现在该行中,但我不确定还有什么)。我想也许会有一些
问题:在大型项目中使用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 打印它刚刚读取的任何行,除非它与该正则表达式匹配。这有效地从每个文件中删除了匹配的行。
所有评论(0)