2

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

x,y,z,?,?

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

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

有任何想法吗?

4

2 回答 2

1

试试cout(.*,){4}

请注意,根据代码的编写方式,您可能无法找到该语句:

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

或者

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

或任何数量的类似变体......最好寻找生成这种输出的例程。(也许是微妙的转变,但它不仅仅是盲目地寻找你已经得到的字符串。)

于 2012-07-10T00:47:01.647 回答
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 打印它刚刚读取的任何行,除非它与该正则表达式匹配。这有效地从每个文件中删除了匹配的行。

于 2012-07-10T01:42:34.453 回答