如何在Vi编辑器中删除xml标记之间的值

时间:2014-07-31 15:58:54

标签: vim vi

我希望将所有以AM结尾的列替换为VI中xml以下标记之间的值

<property name="EQ_BNKCRD_30PL_DPD_BAL_AM" desc="EQ_BNKCRD_30PL_DPD_BAL_AM">+000026928134473.000</property>

只需在上述标签中删除+000026928134473.000

我试过了:%s/_AM">*.*</_AM"></g

但输出是

<property name="EQ_RVLV_TRD_OPN_HI_LC_AM"><property>

从上面删除desc部分并删除属性标记/

5 个答案:

答案 0 :(得分:2)

dit 

在正常模式下,这意味着删除标签内部。如果你做的话,那就是&#39;删除标签周围也会删除标签。

答案 1 :(得分:0)

您希望匹配从_AM">到下一个<的所有内容。所以这应该有效:

:%s/_AM">[^<]*</_AM"></g

重要的更改来自>*.*(因为它匹配任意数量的>符号,然后是之后的任何内容)与>[^<]*匹配,这实际上没有多大意义,这意味着匹配一个>,然后是任何不是<

答案 2 :(得分:0)

怎么样:

%s/_AM">\zs[^<]*//

答案 3 :(得分:0)

在这种情况下使用宏可能更容易。要删除标签之间的内容,您可以使用dit。以下内容将搜索注册设置为_AM>,并在每次找到匹配项时查找下一个匹配类型dit

let @/='_AM">' | let @a='ndit@a' | set nowrapscan

然后转到文件gg的顶部并运行存储在@a的寄存器a中的宏。 set nowrapscan是必要的,以确保宏不会永远持续下去。

答案 4 :(得分:0)

为什么不录制搜索下一次出现AM">的宏,将光标向右移动几个字符到标签中,然后dit为“删除标签” - 然后只是播放了很多次

在这种情况下,我经常发现记录一个简单的宏而不是花时间找一个有效的正则表达式会更快。

编辑:完整序列,逻辑分离

/AM">
qa
llll
dit
n
q
500@a