在vim中替换字符串之前和之后

时间:2014-12-29 14:48:41

标签: xml vim

我有一个大型的XML文件,其中包含了作者决定采用的任何愚蠢原因所注释的基本信息。

它类似于以下内容:

<book id="cat2" type="t" group="1234">  <!-- Group Name -->
    <book id='ABC123' type='s'/>   <!-- NameOfBookHere -->
    <book id='etc456' type='s'/>   <!-- Harry Potter -->
    <book id='XYZ234' type='s'/>  <!-- Jurassic Park --> //Notice variable space before the comment tag.
</book>

我希望能够根据第一次更换进行更换。这是我尝试过的。

  1. 我需要摆脱开头的评论标签。我试过了::%s/\/> \+<!-- / name="
  2. 我尝试了另一个类似的标签,不能自动关闭:%s/> \+<!-- / name="
  3. 然后替换剩余的:%s/ -->/"\/>
  4. 结果是这样的:

    <book id="cat2" type="t" group="1234" name="Group Name"/>
        <book id='ABC123' type='s' name="NameOfBookHere"/>
        <book id='etc456' type='s' name="Harry Potter"/>
        <book id='XYZ234' type='s' name="Jurassic Park"/>
    </book>
    

    不幸的是,这会影响其中包含属性<book>的{​​{1}}代码,而这些代码并非自动关闭。

    这意味着我留下了数千个自动关闭的group标签,这些标签不应该是自动关闭的xml标签。当然,手动删除它们是不可行的。

    有没有办法可以根据受第一次替换影响的线路进行另一次替换?或者我的问题有另一种解决方案吗?

1 个答案:

答案 0 :(得分:3)

:%s#\v(\>|/\>)\s*\<!--\s*(.{-})\s*--\># name="\2"\1#

使用:

  • %s:替换所有行
  • #:备用分隔符(在编辑xml时特别有用)
  • \v:使用VeryMagic模式(请参阅:h magic
  • (\>|/\>):捕获>/>
  • \s*:0-n whitespaces
  • \<!--\s*(.{-})\s*--\>:捕获评论中的文字({-}是vim的非贪婪*(类似于*?是其他语言))
  • #:regex的结尾
  • name="\2"\1:插入&#39; name =&#34; comment_text&#34;&#39;并以您首次捕获的分隔符结束

修改

正如Peter Rincker所说,你可以使用“零”或“零”。 (通常为\= / \?,或= / ?,如果非常神奇的话)第一组中的量词表示可能存在/:< / p>

:%s#\v(/?\>)\s*\<!--\s*(.{-})\s*--\># name="\2"\1#