如何使用vim基于正则表达式删除文件中的文本

时间:2010-08-07 04:35:37

标签: vim

我有一个像这样的XML文件:

<fruit><apple>100</apple><banana>200</banana></fruit>
<fruit><apple>150</apple><banana>250</banana></fruit>

现在我要删除文件中的所有文本,但标记为apple的文字除外。也就是说,该文件应包含:

100
150

我怎么能做到这一点?

3 个答案:

答案 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_