vim搜索和追加/修改

时间:2019-03-07 16:43:21

标签: text vim replace

有没有一种方法可以在vim中搜索文本然后进行修改,而不仅仅是覆盖所说的文本?也就是说,如果每个匹配项都与某个模式匹配,那么我想用唯一的文本替换每个匹配项,部分是基于匹配匹配模式的文本旁边的字符。

具体地说,我想执行以下操作: 我想用/\*.png替换与模式/\*.png alt=* title=\*匹配的文本,其中*是在每种情况下都不同的文本。 预先感谢!

2 个答案:

答案 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替代是一个大话题。我可以建议您阅读以下帮助主题: