使用ack在大型项目中查找打印行

时间:2012-07-10 00:08:23

标签: regex ubuntu ack

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

  

X,Y,Z,?,?

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

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

有什么想法吗?

2 个答案:

答案 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打印它刚刚读取的任何行,除非它与该正则表达式匹配。这有效地删除了每个文件中的匹配行。