替换 vim 中的前后字符串

  • 本文关键字:字符串 vim 替换 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/ -->/"/>

结果是这样的:

<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>带有属性group的标签,这些标签不是自关闭的。

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

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

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

跟:

  • %s:在所有行上替换
  • #:备用分隔符(编辑XML时特别有用)
  • v:使用非常魔术模式(见:h magic
  • (>|/>):捕获>/>
  • s*:0-n 空格
  • <!--s*(.{-})s*-->:捕获注释中的文本({-}是 vim 的非贪婪*(类似于*?是其他语言))
  • #:正则表达式结束
  • name="2"1:插入"name="comment_text"并以您首次捕获的分隔符结尾

编辑:

正如彼得·林克所说,你可以在第一组中使用"零或一"(通常是=/?,或者=/?,如果非常神奇的话)量词来表示可能存在/

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

最新更新