我有下面的字符串。
ABC-10,some_text,EDFG-24,some_text2,...and等.
我需要在每一行末尾添加以下内容:ABC#10#EDFG#24#.诸若此类。
这是我的搜索模式。
\\(\\w\\{-}\\)-\\(\\d\\{1,2\\}\\)我可以进一步使用\1 (字母)和\2 (数字)来获得模式所需的部分。但是如何同时打印所有匹配的图案呢?
如果我写
:%s/search_pattern/&#\1#\2我只得到第一个匹配模式,即ABC#10。如何添加所有匹配模式?
发布于 2015-02-12 14:58:19
对于正则表达式来说,这是一项艰巨的任务,因为您必须假设解析整行以插入数据,并且不能再次解析它(除非使用递归的解析,我认为这是vim所缺乏的),所以一个肮脏的选项(只是为了好玩)是使用一个循环并多次应用相同的正则表达式,例如:
:for i in range(10) | s/\v((\w{-})-(\d{1,2}))(.*\2#\3)@!(.*)$/\1\5#\2#\3/e | endfor它为您正在搜索的文本进行分组,并使用非正面的前瞻性断言来检查未添加的部分。
请注意,我假设同一行中不会有超过10个块,因为我不会再循环多次,您可以增加(或减少这个数字)。还请注意,对于每一行,vim将尝试它十次,但它不会抱怨,因为我使用了/e标志来沉默它。
在我的例子中得出的结果:
[ABC-10, some_text], [EDFG-24, some_text2]#ABC#10#EDFG#24发布于 2015-02-12 13:53:01
在“替换”命令末尾添加/g:
:%s/search_pattern/&#\1#\2/ghttps://stackoverflow.com/questions/28479143
复制相似问题