有没有一种方法可以在vim中搜索文本然后进行修改,而不仅仅是覆盖所说的文本?也就是说,如果每个匹配项都与某个模式匹配,那么我想用唯一的文本替换每个匹配项,部分是基于匹配匹配模式的文本旁边的字符。
具体地说,我想执行以下操作:
我想用/\*.png
替换与模式/\*.png alt=* title=\*
匹配的文本,其中*
是在每种情况下都不同的文本。
预先感谢!
答案 0 :(得分:1)
您可以使用命令行。 在Linux中使用sed。
sed -i 's/\.png/\.png alt=* title=*/g'
此处正在.png
上进行搜索,并替换为.png alt=* title=*
。
您必须在之前使用反斜杠。因为它是一个特殊字符。
答案 1 :(得分:1)
您可以使用子匹配项将结果替换为部分匹配项。例如,假设您有以下html:
<img src="foo_one.png" />
<img src="bar_two.png" />
您可以运行以下命令:
:%s/"\(.\{-}\)\.png"/"\1.png" title="\1" alt="\1"/g
.\{-}
将匹配“ .png
部分之前的任何数量的字符,非贪婪地匹配”(:help /\{
)以及其周围的括号\(
和{ {1}}将其标记为捕获组,然后将其替换为\)
(第一个捕获组)。运行此程序即可:
\1
现在,如果您需要更复杂的替换,例如将文件名转换为人类可读的字符串,则可以使用<img src="foo_one.png" title="foo_one" alt="foo_one" />
<img src="bar_two.png" title="bar_two" alt="bar_two" />
替换标志将字符串替换为任何表达式,例如函数调用。例如,这是我们可以在上面的文本上运行的内容:
\=
这使用两种特定于Vim的模式::%s/title="\zs\(.\{-}\)\ze"/\=lib#CamelCase(submatch(1))/g
和\zs
。这些是“比赛开始”和“比赛结束”。将搜索的内容是整个模式\ze
。但是,将替换为title=...
和\zs
之间的 only 。这样可以更轻松地将\ze
的结果用作直接替换。
请注意,您这次不需要lib#CamelCase
/ \(
括号,因为您可以将\)
用于“整个匹配”:
submatch(0)
函数%s/title="\zs.\{-}\ze"/\=lib#CamelCase(submatch(0))/g
是我自己的函数,其实现方式如下:
lib#CamelCase
您可以编写任何需要输入并返回替换字符串的函数,以执行所需的任何操作。
我不确定您对Vim和正则表达式的经验水平如何,因此很难给出具体建议,而Vim替代是一个大话题。我可以建议您阅读以下帮助主题: