如何在 Vim 中多次将搜索到的模式附加到行尾?
How to append to the end of a line a searched pattern several times in Vim?
我有以下字符串。
[ABC-10, some_text], [EDFG-24, some_text2], ...等等。
我需要在每一行的末尾添加以下内容:ABC#10#EDFG#24#...等等。
这是我的搜索模式。
\(\w\{-}\)-\(\d\{1,2\}\)
我可以进一步使用替换 </code>(字母)和 <code>
(数字)来获取模式的所需部分。但是如何一次打印所有匹配的模式呢?
如果我写
:%s/search_pattern/&##
我只得到第一个匹配的模式,即 ABC#10。如何全部添加?
在替换命令末尾添加/g
:
:%s/search_pattern/&##/g
这对于正则表达式来说是一项艰巨的任务,因为您必须假设解析整行以插入数据,并且您不能返回来再次解析它(除非使用递归的,我认为 vim
缺少),所以一个肮脏的选择(只是为了好玩)是使用循环并多次应用相同的正则表达式,例如:
:for i in range(10) | s/\v((\w{-})-(\d{1,2}))(.*#)@!(.*)$/##/e | endfor
它会对您正在搜索的文本进行分组,并使用非肯定的先行断言来检查尚未添加的部分。
注意我假设同一行不会超过十个块,因为我不会循环更多次,你可以递增(或递减)这个数字。另请注意,对于每一行 vim
将尝试十次,但它不会抱怨,因为我已经使用 /e
标志将其静音。
在我的示例中产生的结果:
[ABC-10, some_text], [EDFG-24, some_text2]#ABC#10#EDFG#24
我有以下字符串。
[ABC-10, some_text], [EDFG-24, some_text2], ...等等。
我需要在每一行的末尾添加以下内容:ABC#10#EDFG#24#...等等。
这是我的搜索模式。
\(\w\{-}\)-\(\d\{1,2\}\)
我可以进一步使用替换 </code>(字母)和 <code>
(数字)来获取模式的所需部分。但是如何一次打印所有匹配的模式呢?
如果我写
:%s/search_pattern/&##
我只得到第一个匹配的模式,即 ABC#10。如何全部添加?
在替换命令末尾添加/g
:
:%s/search_pattern/&##/g
这对于正则表达式来说是一项艰巨的任务,因为您必须假设解析整行以插入数据,并且您不能返回来再次解析它(除非使用递归的,我认为 vim
缺少),所以一个肮脏的选择(只是为了好玩)是使用循环并多次应用相同的正则表达式,例如:
:for i in range(10) | s/\v((\w{-})-(\d{1,2}))(.*#)@!(.*)$/##/e | endfor
它会对您正在搜索的文本进行分组,并使用非肯定的先行断言来检查尚未添加的部分。
注意我假设同一行不会超过十个块,因为我不会循环更多次,你可以递增(或递减)这个数字。另请注意,对于每一行 vim
将尝试十次,但它不会抱怨,因为我已经使用 /e
标志将其静音。
在我的示例中产生的结果:
[ABC-10, some_text], [EDFG-24, some_text2]#ABC#10#EDFG#24