【问题标题】:How to extract text matching a regex using Vim?如何使用 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

标签: vim text extract text-extraction


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    :%normal df(f)D
    

    这意味着:

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

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

    :5,10normal df(f)D
    

    【讨论】:

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

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

    【讨论】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2011-01-12
      • 1970-01-01
      • 2021-06-11
      • 2021-07-06
      相关资源
      最近更新 更多