所以我有一个运行时打印的数据集是basicly这是一个非常大的项目:使用ACK找到印刷生产线的大型项目
X,Y,Z,?
我想找到这里正在打印,所以我可以删除这个。
我试过ack-grep for std :: cout但是有这么多文件。有谁知道如何在一行中搜索std :: cout和4个逗号(也就是说,我知道std :: cout和4个逗号会出现在行中,但我不知道还有什么)。我想也许会有一些正则表达式用于此,例如find std :: cout和“,”但其中四个。
任何想法?
所以我有一个运行时打印的数据集是basicly这是一个非常大的项目:使用ACK找到印刷生产线的大型项目
X,Y,Z,?
我想找到这里正在打印,所以我可以删除这个。
我试过ack-grep for std :: cout但是有这么多文件。有谁知道如何在一行中搜索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打印它刚刚读取的任何行,除非它匹配该正则表达式。这有效地删除了每个文件的匹配行。
尝试cout(.*,){4}
。
注意,你可能很难找到,这取决于代码是如何写的语句:
char *s="%s,%s,%s,%s";
printf(s,x,y,z,?,?);
或
cout <<
"x,",
"y,",
"z,",
"?,",
"?\n";
或任意数量的类似的变化......这可能会更好而是寻找产生输出的种类的例程。 (微妙的变化,也许,但它不只是一味地寻找你已经得到的字符串。)
感谢您的帮助。 – 2012-07-10 00:59:46
只有一行,我只是要手动删除它,但这是一个很好的答案+1。 – 2012-07-10 04:49:31