Vim找到并替换.我怎么能这样做?

Dav*_*ker 4 vim replace

我有一个XML文件,我想对其进行一些更改.例如,我想在Vim中打开文件并运行查找并替换memory="..."属性的所有实例,memory="24G"但仅当元素来自name="node-0...".这是一个例子:

process name="node-0-3" numaNode="3" memory="14G" logConfig="logback-shards.xml"
process name="node-0-4" numaNode="4" memory="34G" logConfig="logback-shards.xml"
process name="node-0-5" numaNode="5" memory="44G" logConfig="logback-shards.xml"
Run Code Online (Sandbox Code Playgroud)

用...来代替

process name="node-0-3" numaNode="3" memory="24G" logConfig="logback-shards.xml"
process name="node-0-4" numaNode="4" memory="24G" logConfig="logback-shards.xml"
process name="node-0-5" numaNode="5" memory="24G" logConfig="logback-shards.xml" 
Run Code Online (Sandbox Code Playgroud)

我怎么能在Vim中做到这一点?

rom*_*inl 8

:g/node-0/s/memory="\zs\d\{2\}\u\ze"/24G
Run Code Online (Sandbox Code Playgroud)

一步步:

  • :g/node-0

    使用该:global命令查找包含的所有行node-0

  • s/memory="\zs\d\{2\}\u\ze"/24G

    1. memory="

    2. 通过在这里开始比赛,让它脱离实际比赛 \zs

    3. 匹配两个数字后跟一个大写字母 \d\{2\}\u

    4. 实际比赛在此结束 \ze

    5. 遗漏了收尾双引号.

    6. 替换实际匹配 24G

(使用更精确的模式编辑以适应提问者的真实用例)

编辑

使用Ingo的评论:

:g/node-0/s/memory="\zs[^"]*\ze"/24G
Run Code Online (Sandbox Code Playgroud)

  • 可能只是想将`.*`转换为`.\ { - }`,因为它不贪婪. (2认同)