我有一个大的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>
我希望能够根据第一次替换进行替换。这是我尝试过的。
- 我需要摆脱开头的评论标签。我试过:
:%s//> +<!-- / name="
- 我尝试另一个类似的标签,用于不是自闭合
:%s/> +<!-- / name="
- 然后替换其余的:
%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#