Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Text vim搜索和附加/修改_Text_Vim_Replace - Fatal编程技术网

Text vim搜索和附加/修改

Text vim搜索和附加/修改,text,vim,replace,Text,Vim,Replace,有没有一种方法可以在vim中搜索文本,然后进行修改,而不仅仅是覆盖所述文本?i、 e.如果每个事件都匹配某个模式,我想用唯一的文本替换每个事件,部分基于匹配该模式的文本旁边的字符 具体来说,我想做以下几点: 我想用/\*.png替换与模式匹配的文本/\*.png alt=*title=\*,其中*是每种情况下都不同的文本。 提前谢谢 您可以使用命令行执行此操作。 在Linux中使用sed sed -i 's/\.png/\.png alt=* title=*/g' 在这里,它在.png上运行搜

有没有一种方法可以在vim中搜索文本,然后进行修改,而不仅仅是覆盖所述文本?i、 e.如果每个事件都匹配某个模式,我想用唯一的文本替换每个事件,部分基于匹配该模式的文本旁边的字符

具体来说,我想做以下几点: 我想用
/\*.png
替换与模式匹配的文本
/\*.png alt=*title=\*
,其中
*
是每种情况下都不同的文本。
提前谢谢

您可以使用命令行执行此操作。 在Linux中使用sed

sed -i 's/\.png/\.png alt=* title=*/g'
在这里,它在
.png
上运行搜索,并替换为
.png alt=*title=*

您必须在输入前使用反斜杠。因为它是一个特殊的字符。

您可以使用命令行来实现这一点。 在Linux中使用sed

sed -i 's/\.png/\.png alt=* title=*/g'
在这里,它在
.png
上运行搜索,并替换为
.png alt=*title=*

您必须在输入前使用反斜杠。因为它是一个特殊字符。

您可以使用子匹配将结果替换为部分匹配。例如,假设您有以下html:


您可以运行以下命令:

:%s/"\(.\{-}\)\.png"/"\1.png" title="\1" alt="\1"/g
\{-}
将匹配“在
.png
部分之前的任意数量的字符,非贪婪”()及其周围的括号,
\(
\)
将其标记为捕获组,然后在替换中用作
\1
(第一个捕获组)。运行此命令将为您提供:


现在,如果需要更复杂的替换,如将文件名转换为人类可读的字符串,可以使用
\=
替换标志将字符串替换为任何表达式,如函数调用。例如,我们可以在上面的文本中运行以下内容:

:%s/title="\zs\(.\{-}\)\ze"/\=lib#CamelCase(submatch(1))/g
这使用了两种特定于Vim的模式:
\zs
\ze
。这些是“比赛开始”和“比赛结束”。将要搜索的是整个模式,
title=…
。但是,将被替换的内容仅在
\zs
\ze
之间。这使得使用
lib#CamelCase
的结果作为直接替换更加容易

请注意,这一次您不需要使用
\(
/
\)
括号,因为您可以使用
子匹配(0)
进行“整个匹配”:

函数
lib#CamelCase
是我自己的函数,实现方式如下:

function! lib#CamelCase(word)
  return substitute(a:word, '_\(.\)', '\U\1', 'g')
endfunction
您可以编写任何接受一些输入并返回替换字符串的函数,执行您需要的任何操作


我不确定您对Vim和正则表达式的经验水平,因此很难给出具体的建议,Vim替换是一个大话题。我建议您仔细阅读以下帮助主题:


您可以使用子匹配将结果替换为部分匹配。例如,假设您有以下html:


您可以运行以下命令:

:%s/"\(.\{-}\)\.png"/"\1.png" title="\1" alt="\1"/g
\{-}
将匹配“在
.png
部分之前的任意数量的字符,非贪婪”()及其周围的括号,
\(
\)
将其标记为捕获组,然后在替换中用作
\1
(第一个捕获组)。运行此命令将为您提供:


现在,如果需要更复杂的替换,如将文件名转换为人类可读的字符串,可以使用
\=
替换标志将字符串替换为任何表达式,如函数调用。例如,我们可以在上面的文本中运行以下内容:

:%s/title="\zs\(.\{-}\)\ze"/\=lib#CamelCase(submatch(1))/g
这使用了两种特定于Vim的模式:
\zs
\ze
。这些是“比赛开始”和“比赛结束”。将要搜索的是整个模式,
title=…
。但是,将被替换的内容仅在
\zs
\ze
之间。这使得使用
lib#CamelCase
的结果作为直接替换更加容易

请注意,这一次您不需要使用
\(
/
\)
括号,因为您可以使用
子匹配(0)
进行“整个匹配”:

函数
lib#CamelCase
是我自己的函数,实现方式如下:

function! lib#CamelCase(word)
  return substitute(a:word, '_\(.\)', '\U\1', 'g')
endfunction
您可以编写任何接受一些输入并返回替换字符串的函数,执行您需要的任何操作


我不确定您对Vim和正则表达式的经验水平,因此很难给出具体的建议,Vim替换是一个大话题。我建议您仔细阅读以下帮助主题:


虽然我的原始查询不够清晰(您的解决方案可能会解决这个问题),但对于我所描述的问题(据我所知)它不起作用,因为(据我所知)没有使用匹配模式之前遇到的字符,即“*”。请具体说明您想要什么。尽管我的原始查询不够清晰(您的解决方案可能会解决这个问题),但对于我描述的(据我所知)不使用匹配模式之前遇到的字符,即“*”的问题,它将不起作用。请指定所需内容。如果文本是静态的或已在应替换的行中,则可以使用正则表达式。请指定用于搜索和替换的文本。示例为“filename.png”到“filename.png alt=”filename“title=”filename“。这也可以通过sed实现。如果文本是静态的或已经在应替换的行中,则可以使用正则表达式。请指定用于搜索和替换的文本。例如“filename.png”到“filename.png alt=“filename”title=“filename”。这也可以通过sed实现。