2014-02-25 102 views
2

我想知道如何才能檢查我的1000行txt文件中是否有兩行代碼具有相同的模式。在第三部分,即「CF.Name」,即我有類似的東西:如何檢查VIM中是否沒有兩行包含相同的字符串

APPNAME   NO CF.Name 
automotive_bitcount 1 -funsafe-math-optimizations -fno-guess-branch-probability  
automotive_bitcount 1 -fno-guess-branch-probability -fno-inline-functions -funroll-all-loops -O2 
security_blowfish_e 2 -funsafe-math-optimizations -fno-ivopts -O2 
security_blowfish_e 2 -funsafe-math-optimizations -fno-ivopts -fno-tree-loop-optimize -funroll-all-loops -O2 

等等。只是想確保所有生成的CF.Name是彼此不同的。

回答

3

我的PatternsOnText plugin有一個:PrintDuplicateLinesIgnoring命令,該命令在跳過某些部分時搜索行中的重複內容。在你的例子中,你想忽略前兩個部分,它們可以匹配開始行,一些非空白,一些空白,一些非空白,一些空白。 Ergo:

:PrintDuplicateLinesIgnoring /^\S\+\s\+\S\+\s\+/ 

注意:這仍然不會查找以相同的參數以不同的順序給出的行;希望你的創建過程能夠確保,否則你必須首先對參數進行排序。

+0

非常感謝,你總是知道哪個插件可以用於vim,這是第二次! ;) – Amir

2

刪除除了要檢查的列以外的所有列,然後:sort u。如果結果是1000行,那麼您知道該部分中沒有兩行具有相同的模式。

+0

感謝您的回覆,如果不是零,請在排序後指出錯誤的答案? – Amir

+1

我想,刪除其他列後,你可以先':排序',然後複製到另一個緩衝區和':排序u'的那個。然後你可以在每個緩衝區上「:diffthis」。 – Jeff

2

我會採取其他的答案部分:使用:sort在@傑夫的答案,但使用的模式作爲@Ingo Karkat的答案,而不是刪除其他列:

:sort /^\S\+\s\+\S\+\s\+/ 

現在對於新的東西:多線模式。如果要查找兩條相同的連續行,請使用/^\(.*\)\n\1$。如果你關心的第三列(由空格分隔),然後搜索

/\v^\S+\s+\S+\s+(\S+).*\n\S+\s+\S+\s+\zs\1\[email protected]! 

對於多種,我已經使用了\v(「非常神奇」)的變體。 (這種方式+@!不需要前面\。)另外,我滑入\zs(「從這裏開始」),以便您只突出有趣的部分。

相關問題