如何使用 Vim 提取匹配正则表达式的文本?

Posted

技术标签:

【中文标题】如何使用 Vim 提取匹配正则表达式的文本?【英文标题】:How to extract text matching a regex using Vim? 【发布时间】:2011-09-27 17:37:11 【问题描述】:

我想用 vim 从文本中提取一些数据.. 数据是这样的:

72" title="(168,72)" onmouseover="posizione('(168,72)');" onmouseout="posizione('(-,-)');">>
72" title="(180,72)" onmouseover="posizione('(180,72)');" onmouseout="posizione('(-,-)');">>
72" title="(192,72)" onmouseover="posizione('(192,72)');" onmouseout="posizione('(-,-)');">>
72" title="(204,72)" onmouseover="posizione('(204,72)');" onmouseout="posizione('(-,-)');">>

我需要提取的数据包含在:title="(168,72)"中。 特别是我有兴趣只提取这些坐标。

我虽然关于使用 vim 首先删除 title=" 之前的所有内容 .. 但我并不是真正的正则表达式大师 .. 所以我问你:如果有人有任何提示:请告诉我:)

【问题讨论】:

和其他贴的vim一样使用流式表达非常强大。这些流操纵器也可用于 whit sed(几乎与 :% 相同)。如果您想了解有关这些表达式的更多信息,请查看此sed introduction。 【参考方案1】:

这将用制表符分隔的每行坐标列表替换每一行:

:%s/.* title="(\(\d\+\),\(\d\+\))".*/\1\t\2

【讨论】:

【参考方案2】:

这个任务可以通过一个更简单的解决方案和使用普通命令的几个按键来完成:

:%normal df(f)D

这意味着:

    % - 在所有文件行上运行正常命令; normal - 在正常模式下运行以下命令; df( - 删除所有内容,直到找到括号(包括括号); f) - 将光标移动到 ); D - 删除所有内容,直到行尾。

您还可以设置一个范围,例如,从第 5 行运行到第 10 行:

:5,10normal df(f)D

【讨论】:

不使用宏的有趣方式 普通命令是一个非常强大的工具。这几乎是一个“一次性宏”。【参考方案3】:

如果您需要针对这种一次性情况的临时解决方案,只需使用 CTRL-v 选择可视块可能会更快。这将允许您选择任意文本列(在您的情况下,包含title="(X,Y)" 的列),然后可以使用y 照常复制。

【讨论】:

是的,我发现自己使用的快速无脑系列是:^vGx....... 从视觉上判断重复次数 (.) - 实用但在 80% 的情况下都能正常工作【参考方案4】:

您可以匹配 title=() 中的所有内容并丢弃其他所有内容,如下所示:

:%s,.*title="(\(.*\))".*,\1,

【讨论】:

以上是关于如何使用 Vim 提取匹配正则表达式的文本?的主要内容,如果未能解决你的问题,请参考以下文章

使用awk / grep / sed / bash / vim进行正则表达式匹配和打印

Vim 多行正则表达式给出重叠匹配

文本提取——正则表达式

如何使用正则表达式匹配 className 内的文本? [复制]

使用正则表达式重新字符串匹配提取 URL 链接 - Python

如何在正则表达式中匹配 \n 但从以下文本中跳过 n?