如何在Vim中多次将搜索模式追加到行尾?

时间:2015-02-12 13:49:24

标签: regex vim

我有以下字符串。

[ABC-10,some_text],[EDFG-24,some_text2],......等等。

我需要在每一行的末尾添加以下内容:ABC#10#EDFG#24#...依此类推。

这是我的搜索模式。

\\(\\w\\{-}\\)-\\(\\d\\{1,2\\}\\)

我可以在替代\1(字母)和\2(数字)中进一步使用以获得模式所需的部分。但是如何一次打印所有匹配的模式呢?

如果我写

:%s/search_pattern/&#\1#\2

我只得到第一个匹配模式,即ABC#10。如何添加所有这些?

2 个答案:

答案 0 :(得分:4)

这对于正则表达式来说是一项艰巨的任务,因为你必须假设解析整行来插入数据,你不能再回来解析它(除非使用递归的,我认为vim是缺乏的),所以一个脏选项(只是为了好玩)是使用循环并多次应用相同的正则表达式,如:

:for i in range(10) | s/\v((\w{-})-(\d{1,2}))(.*\2#\3)@!(.*)$/\1\5#\2#\3/e | endfor

它会对您正在搜索的文本进行分组,并使用非正向预见断言来检查是否尚未添加该部分。

请注意,我假设在同一行中不会有超过十个块,因为我不会循环更多次,您可以递增(或递减该数字)。另请注意,对于每一行vim将尝试十次,但它不会抱怨,因为我已使用/e标志来静音。

我的例子中产生的结果:

[ABC-10, some_text], [EDFG-24, some_text2]#ABC#10#EDFG#24

答案 1 :(得分:1)

在替换命令的末尾添加/g

:%s/search_pattern/&#\1#\2/g