在Vim中,我如何搜索和替换其他所有匹配?

Osa*_*mal 12 vim replace editor

说我有以下文件

<block>
    <foo val="bar"/>
    <foo val="bar"/>
</block>
<block>
    <foo val="bar"/>
    <foo val="bar"/>
</block>
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做

<block>
    <foo val="bar1"/>
    <foo val="bar"/>
</block>
<block>
    <foo val="bar1"/>
    <foo val="bar"/>
</block>
Run Code Online (Sandbox Code Playgroud)

有一件事我试图做的是记录一个宏用:%s/bar/bar1/gc,按yn各一次,然后尝试编辑宏.由于某种原因,我无法编辑宏.:(

Pet*_*ker 36

只是为了表明这可以在替换中完成:

:let a = ['', '1']
:%s/bar\zs/\=reverse(a)[0]/g
Run Code Online (Sandbox Code Playgroud)

概观

在每次替换后数组在就地反转之后,bar在每个末尾替换为变量中数组的第一个元素a.

细节的荣耀

  1. let a = ['', '1']定义一个变量a来保存我们的数组
  2. %s/.../.../ 在文件中的每一行上进行替换
  3. %s/bar\zs/.../ 在bar上进行替换,但在使用后开始替换 \zs
  4. \=:s命令的替换部分内部使用以下表达式的值
  5. reverse(a) reverse只是反转数组,但就地就是这样
  6. reverse(a)[0] reverse返回现在反转的数组,所以得到第一个元素
  7. /g 替换行中的所有出现(可选)

一般情况

:let a = ['a', 'b', 'c']
:%s/bar\zs/\=add(a, remove(a, 0))[-1]/g
Run Code Online (Sandbox Code Playgroud)

一般情况"旋转"数组,a就地并使用数组的最后位置作为替换替换的值.

有关更多帮助请参阅

:h :s
:h range
:h /\zs
:h :s\=
:h reverse(
:h :s_flags
:h Lists
:h add(
:h remove
Run Code Online (Sandbox Code Playgroud)

  • 这是Vim力量的最佳意义之一. (3认同)
  • 这简直是​​邪恶的. (2认同)

tux*_*imo 5

您可以使用

:%s/bar/bar1/gc
Run Code Online (Sandbox Code Playgroud)

它会在每场比赛中询问你是否要更换它。

否则,您必须指定其中的全部内容,并将第一个栏替换为 bar1。