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

时间:2012-10-02 13:38:52

标签: 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"

替换为

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" 

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

3 个答案:

答案 0 :(得分:8)

:g/node-0/s/memory="\zs\d\{2\}\u\ze"/24G

一步一步:

  • :g/node-0

    使用:global命令查找包含node-0

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

    1. 查找memory="

    2. 通过\zs

    3. 开始匹配,让它脱离实际比赛
    4. 匹配两个数字后跟一个大写字母\d\{2\}\u

    5. 实际匹配在此处以\ze

    6. 结束
    7. 遗漏了收尾双引号。

    8. 24G

    9. 替换实际匹配

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

修改

使用Ingo的评论:

:g/node-0/s/memory="\zs[^"]*\ze"/24G

答案 1 :(得分:1)

如果您不想每次都打开vim,可以使用sed单行:

sed -i '/node-0/s/memory=".\{3\}/memory="24G"/' foo.txt

或者您可以使用以下命令从vim内部使用相同的命令:

:%!sed '/node-0/s/memory=".\{3\}/memory="24G"/'

答案 2 :(得分:0)

如果所有行的格式相同,您可以尝试:

f 1 //在第一行获得“14G”

Ctrl + v //启动视觉阻止模式

2 j //选择[1] 4G,[3] 4G,[4] 4G

r 2 //替换为2