我需要找到具有相同模式的所有字符串对。 例如:
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”中。 然后我试着回应我得到的计数,但是当我尝试这样做时没有任何反应。
所以函数编写的最后一个问题是我无法将命令执行结果写入变量。
如果您有其他解决方案 - 请向我说明。
更新 对不起,描述不好。我想只删除文本中有图案双胞胎的字符串。
答案 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....'