所以我有一个非常大的项目,在运行时打印一个基本的数据集:
X,Y,Z,?,?
我想找到打印的位置,以便我可以删除它。
我已经为std :: cout尝试了ack-grep,但文件太多了。有没有人知道如何在一行中搜索std :: cout和4个逗号(即我知道std :: cout和4个逗号将出现在该行中,但我不确定还有什么)。我想也许会有一些正则表达式用于此,例如在find std :: cout和“,”中有四个。
有什么想法吗?
答案 0 :(得分:1)
尝试cout(.*,){4}
。
请注意,根据代码的编写方式,您可能无法找到语句:
char *s="%s,%s,%s,%s";
printf(s,x,y,z,?,?);
或
cout <<
"x,",
"y,",
"z,",
"?,",
"?\n";
或任意数量的类似变体......反而寻找生成种输出的例程可能会更好。 (或许是微妙的转变,但它不仅仅是盲目地看待你已经拥有的弦乐。)
答案 1 :(得分:1)
几乎同意
的方法
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打印它刚刚读取的任何行,除非它与该正则表达式匹配。这有效地删除了每个文件中的匹配行。