4

我有一个 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 中做到这一点?

4

3 回答 3

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. 匹配两个数字后跟一个大写字母\d\{2\}\u

    4. 真正的比赛在这里结束\ze

    5. 省略结束双引号。

    6. 将实际匹配替换为24G

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

编辑

使用 Ingo 的评论:

:g/node-0/s/memory="\zs[^"]*\ze"/24G
于 2012-10-02T13:58:07.673 回答
1

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

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

或者你可以在 vim 内部使用相同的命令:

:%!sed '/node-0/s/memory=".\{3\}/memory="24G"/'
于 2012-10-02T14:02:16.920 回答
0

如果所有行都具有相同的格式,你可以试试这个:

f1 // 在第一行到达“14G”

Ctrl+ v// 启动可视块模式

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

r2 // 替换为 2

于 2012-10-03T16:20:05.387 回答