如何检查VIM中是否没有两行包含相同的字符串

时间:2014-02-25 14:04:57

标签: vim find pattern-matching

我想知道如何在我的1000行txt文件中检查是否有两行具有相同的模式。在第三部分,即“CF.Name”,即我有类似的东西:

 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 个答案:

答案 0 :(得分:3)

我的PatternsOnText plugin有一个:PrintDuplicateLinesIgnoring命令,可以在跳过某些部分时搜索行中的重复内容。在您的示例中,您希望忽略前两个部分,可以通过行开头,一些非空白,一些空白,一些非空白,一些空白来匹配。埃尔戈:

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

注意:这仍然找不到以不同顺序给出相同参数的行;希望你的创建过程能够确保,或者你必须先对参数进行排序。

答案 1 :(得分:2)

删除除要检查的列之外的所有列,然后:sort u。如果结果是1000行,那么您知道该部分中没有两行具有相同的模式。

答案 2 :(得分:2)

我会接受部分其他答案:在@ Jeff的答案中使用:sort,但使用@Ingo Karkat答案中的模式,而不是删除其他列:

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

现在换新的东西:多线模式。如果要查找两条相同的连续行,请使用/^\(.*\)\n\1$。如果您关心第三列(由空格分隔),则搜索

/\v^\S+\s+\S+\s+(\S+).*\n\S+\s+\S+\s+\zs\1\S@!

对于多样性,我使用了\v(“非常神奇”)变体。 (这样+@!不需要以\开头。)此外,我在\zs(“从这里开始”)滑入,这样您只需突出显示有趣的部分。