2012-07-10 23 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