VIM:删除具有相同模式的字符串

时间:2017-02-15 12:29:56

标签: vim

我需要找到具有相同模式的所有字符串对。 例如:

another string, that is not interesting
la-di-da-di __pattern__ -di-la-di-la
la-di-da-da-di-la __pattern__ -la-da-li-la
and yet another usual string

所以我想在里面用__pattern__删除字符串。

我不知道如何使用内置命令来完成它,现在我有了无法正常工作的功能:

function! DelDup(pattern)
    echom a:pattern
    redir => l:count
    execute "normal! :%s/a:pattern//n\<cr>"
    redir END
    echo l:count
endfunction

这里我尝试运行“:%s / a:pattern // n”来查找文本中模式的出现次数。 同时我尝试将其放入变量“l:count”中。 然后我试着回应我得到的计数,但是当我尝试这样做时没有任何反应。

所以函数编写的最后一个问题是我无法将命令执行结果写入变量。

如果您有其他解决方案 - 请向我说明。

更新 对不起,描述不好。我想只删除文本中有图案双胞胎的字符串。

2 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了您的问题,但我假设您要删除至少有2个匹配项的所有行。如果是这种情况,您可以使用以下命令:

:g/\(__pattern__.*\)\{2,}/d

这是如何工作的,它删除了匹配的所有行(:g/../d)。 该模式由一个组(\(..\))组成,该组需要至少匹配2次(\{2,})。并且模式最后有.*,因此它匹配模式匹配之间的所有内容。

答案 1 :(得分:0)

有很多方法可以计算模式的出现次数,我很确定在这个主题上存在Q / A.让我们以另一种方式做到这一点并与下一步联系起来。 (是的,这是完全混淆的,但它允许以编程方式获取信息,而无需在重定向后解析:substitute的本地化结果。)

" declare a list that contain all matches
let matches = []

" replace each occurrence of the "pattern" with:
" the result of the expression "\=" that can be 
" interpreted as the last ([-1]) element of the 
" list "matches" returned by the function (add) 
" that adds the current match (submatch(0)) to the
" list
:%s/thepattern/\=add(matches, submatch(0))[-1]/gn
" The big caveat of this command is that it modifies 
" the current buffer.
" We need something like the following to leave it unmodified:
:g/thepattern/call substitute(getline('.'), 'thepattern', '\=add(counter, submatch(0))[-1]', 'g')
" Note however that this flavour won't work with multi-lines patterns

" Now you can test the number of matches or do anything fancy with it
if len(matches) > 1
  " replaces matches with nothing
  :%s/thepattern//g
endif

只有当您想要将其定义为您需要使用的功能时:

exe 'normal :%s/'.escape(a:pattern, '/\').'/replacement..../flags....'