我有一个大型的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>
的{{1}}代码,而这些代码并非自动关闭。
这意味着我留下了数千个自动关闭的group
标签,这些标签不应该是自动关闭的xml标签。当然,手动删除它们是不可行的。
有没有办法可以根据受第一次替换影响的线路进行另一次替换?或者我的问题有另一种解决方案吗?
答案 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#