我有一个像这样的XML文件:
<fruit><apple>100</apple><banana>200</banana></fruit>
<fruit><apple>150</apple><banana>250</banana></fruit>
现在我要删除文件中的所有文本,但标记为apple的文字除外。也就是说,该文件应包含:
100
150
我怎么能做到这一点?
答案 0 :(得分:5)
:%s/.*apple>\(.*\)<\/apple.*/\1/
那应该做你需要的。为我工作。
基本上只是抓取所有内容,包括标签,然后反向引用apple开始和结束标记之间的所有内容,并匹配到该行的其余部分。用第一个反向引用替换它,这是苹果标签之间的东西。
答案 1 :(得分:0)
我个人用这个:
%s;.*<apple>\(\d*\)</apple>.*;\1;
由于文本包含'/',它是默认的分隔符,并且使用';'因为sep使代码更清晰。 我发现@Conspicuous Compiler提到的非贪婪匹配应该是
\{-}
而不是Vim中的“{ - }”。 但是,我改变了显眼的'解决方案
%s/.*apple>(.\{-\})<\/apple.*/\1^M/g
我的Vim说它无法找到模式。
答案 2 :(得分:-2)
在这种情况下,可以使用一般技术来收集模式匹配 在my answer中解释了问题“How to extract regex matches using Vim”。
要在列表中收集和存储所有匹配项,请运行Ex命令
:let t=[] | %s/<apple>\(.\{-}\)<\/apple>\zs/\=add(t,submatch(1))[1:0]/g
该命令故意不改变缓冲区的内容,只收集 匹配的文字。要将当前缓冲区的内容设置为 以换行符分隔的匹配列表,使用命令
:0pu=t | +,$d_