2012-07-10 58 views
2

所以我有一个运行时打印的数据集是basicly这是一个非常大的项目:使用ACK找到印刷生产线的大型项目

X,Y,Z,?

我想找到这里正在打印,所以我可以删除这个。

我试过ack-grep for std :: cout但是有这么多文件。有谁知道如何在一行中搜索std :: cout和4个逗号(也就是说,我知道std :: cout和4个逗号会出现在行中,但我不知道还有什么)。我想也许会有一些正则表达式用于此,例如find std :: cout和“,”但其中四个。

任何想法?

回答

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

+0

只有一行,我只是要手动删除它,但这是一个很好的答案+1。 – 2012-07-10 04:49:31

1

尝试cout(.*,){4}

注意,你可能很难找到,这取决于代码是如何写的语句:

char *s="%s,%s,%s,%s"; 
printf(s,x,y,z,?,?); 

cout << 
    "x,", 
    "y,", 
    "z,", 
    "?,", 
    "?\n"; 

或任意数量的类似的变化......这可能会更好而是寻找产生输出的种类的例程。 (微妙的变化,也许,但它不只是一味地寻找你已经得到的字符串。)

+0

感谢您的帮助。 – 2012-07-10 00:59:46